我如何理解另一个浮点悖论——0.1表示为双精度比0.1表示为长双精度更准确?
In [134]: np.double(0.1)
Out[134]: 0.1
In [135]: np.longdouble(0.1)
Out[135]: 0.10000000000000000555
这并不准确。长双代表只是向你展示了更多已经存在的不准确之处。
0.1
是一个Python浮点,其精度与numpy.double
相同。它并不代表精确的十进制值0.1,因为二进制不能以有限的位数表示该值。0.1
表示该值:
>>> import decimal
>>> decimal.Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
这是在该类型的精度范围内可以表示的最接近0.1的值。
当您从0.1
构造numpy.double
或numpy.longdouble
时,这就是您获得的值。对于numpy.longdouble
,这是而不是该类型可以存储的0.1的最佳近似值。
numpy.double
和numpy.longdouble
的repr
都显示了产生输出所需的最小小数位数,如果转换回原始类型,该输出将再现原始值。对于numpy.double
,这只是"0.1"
,因为0.1
已经是最接近0.1的双精度浮点值。对于numpy.longdouble
,它需要更多的数字,因为numpy.longdouble
具有更高的精度,因此它可以表示比0.1
更接近0.1的值。
如果你想要0.1的最佳长双近似值,你应该传递一个字符串而不是Python浮点:
numpy.longdouble('0.1')