提问人:zell 提问时间:9/24/2022 更新时间:9/24/2022 访问量:70
为什么 double 0.1 比它的 long double 版本更准确?
Why is double 0.1 more accurate than its long double version?
问:
我怎么能理解另一个浮点悖论--- 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
答:
7赞
user2357112
9/24/2022
#1
这并不更准确。longdouble repr 只是向您展示了更多已经存在的不准确之处。
0.1
是一个 Python 浮点数,其精度与 相同。它不表示确切的十进制值 0.1,因为二进制不能以有限位数表示该值。 表示此值:numpy.double
0.1
>>> import decimal
>>> decimal.Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')
这是最接近 0.1 的值,可以在类型精度的限制内表示。
当您构造 or from 时,这是您得到的值。对于 ,这不是该类型可以存储的 0.1 的最佳近似值。numpy.double
numpy.longdouble
0.1
numpy.longdouble
两者的 和 显示生成输出所需的最小十进制位数,如果转换回原始类型,该输出将重现原始值。对于 ,这只是 ,因为已经是最接近 0.1 的双精度浮点值。对于 ,它需要更多的数字,因为具有更高的精度,因此它可以表示比 更接近 0.1 的值。repr
numpy.double
numpy.longdouble
numpy.double
"0.1"
0.1
numpy.longdouble
numpy.longdouble
0.1
如果你想要 0.1 的最佳长双近似值,你应该传递一个字符串而不是一个 Python 浮点数:
numpy.longdouble('0.1')
评论
Decimal(np.double('0.1'))
给了我,这可能只是一个打印问题。Decimal('0.1000000000000000055511151231257827021181583404541015625')