为什么双0.1比它的长双版本更准确



我如何理解另一个浮点悖论——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.doublenumpy.longdouble时,这就是您获得的值。对于numpy.longdouble,这是而不是该类型可以存储的0.1的最佳近似值。

numpy.doublenumpy.longdoublerepr都显示了产生输出所需的最小小数位数,如果转换回原始类型,该输出将再现原始值。对于numpy.double,这只是"0.1",因为0.1已经是最接近0.1的双精度浮点值。对于numpy.longdouble,它需要更多的数字,因为numpy.longdouble具有更高的精度,因此它可以表示比0.1更接近0.1的值。

如果你想要0.1的最佳长双近似值,你应该传递一个字符串而不是Python浮点:

numpy.longdouble('0.1')

相关内容

  • 没有找到相关文章

最新更新