为什么 double 0.1 比它的 long double 版本更准确?

Why is double 0.1 more accurate than its long double version?

提问人:zell 提问时间:9/24/2022 更新时间:9/24/2022 访问量:70

问:

我怎么能理解另一个浮点悖论--- 0.1 表示为 double 比 0.1 表示为 long double 更准确?

In [134]: np.double(0.1)
Out[134]: 0.1

In [135]: np.longdouble(0.1)
Out[135]: 0.10000000000000000555
numpy 浮点 精度 long-double

评论

0赞 Mechanic Pig 9/24/2022
Decimal(np.double('0.1'))给了我,这可能只是一个打印问题。Decimal('0.1000000000000000055511151231257827021181583404541015625')

答:

7赞 user2357112 9/24/2022 #1

这并不更准确。longdouble repr 只是向您展示了更多已经存在的不准确之处。

0.1是一个 Python 浮点数,其精度与 相同。它不表示确切的十进制值 0.1,因为二进制不能以有限位数表示该值。 表示此值:numpy.double0.1

>>> import decimal
>>> decimal.Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

这是最接近 0.1 的值,可以在类型精度的限制内表示。

当您构造 or from 时,这是您得到的值。对于 ,这不是该类型可以存储的 0.1 的最佳近似值。numpy.doublenumpy.longdouble0.1numpy.longdouble

两者的 和 显示生成输出所需的最小十进制位数,如果转换回原始类型,该输出将重现原始值。对于 ,这只是 ,因为已经是最接近 0.1 的双精度浮点值。对于 ,它需要更多的数字,因为具有更高的精度,因此它可以表示比 更接近 0.1 的值。reprnumpy.doublenumpy.longdoublenumpy.double"0.1"0.1numpy.longdoublenumpy.longdouble0.1

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

numpy.longdouble('0.1')