有没有办法知道浮点计算什么时候会准确/不准确,而无需实际进行计算?

Is there a way to know when will a floating-point computation be accurate/inaccurate without actually doing the computation?

提问人:zell 提问时间:9/16/2022 最后编辑:zell 更新时间:9/17/2022 访问量:46

问:

我知道浮点计算本质上是不准确的,因为四舍五入错误。但是我怎么能理解它有时是准确的,有时是不准确的,如下所示:

In [58]: 0.2+0.2==0.4
Out[58]: True

In [59]: 0.2+0.1==0.3
Out[59]: False

我想这与浮点数的表示有关。有什么想法吗?特别是,什么时候会准确/不准确——有没有办法提前知道这一点,也就是说,不实际进行计算本身?

IEEE-754 浮点精度 舍入误差

评论

0赞 chtz 9/16/2022
“提前”是什么意思?您对输入数字有任何先验知识吗?例如,只要不溢出,就应该始终准确。如果有,可以检查是否准确。x+xx>=y>=0(x+y) - x == yx+y
1赞 Eric Postpischil 9/16/2022
如果将两个具有相同符号和指数的普通数相加,其低位不同,则结果将不准确。如果将两个具有相同符号和指数的普通数相加,则相差 d 且较小幅度数的低 d 位不全为零,则结果将不准确。如果总和将导致结果的指数大于较大的量级数,并且较小量级数的低 d+1 位不全为零,则结果将不准确。其他情况(不同的标志)也可以描述。这对你有什么用?
0赞 Eric Postpischil 9/16/2022
设 x 和 y 分别是将 .2 和 .1 转换为 IEEE-754 binary64(又名“双精度”)所得到的数字。将 x 和 x 相加将两个具有相同符号和指数且具有相同低位的数字相加,因此它不会落入上述情况。结果是准确的。将 x 和 y 相加将两个指数差为 1 的数字相加。(x 在 [2^−3, 2^−2] 中,所以它的指数是 -3。 y 在 [2^−4, 2^-3] 中,所以它的指数是 -4。结果将具有更大的指数(它将在 [2^−2, 2^−1 中),因此其指数将为 − 2)。y 的低 2 位是 10,因此它们不为零。
0赞 Eric Postpischil 9/16/2022
(使用十六进制表示法表示有效数,x 为 0x1.99999999999ap−3,y 为 0x1.99999999999ap−4。
0赞 chux - Reinstate Monica 9/19/2022
Zell,不幸的是,邮政编码不仅仅是比较添加。它还比较了代码的转换,例如 into ,这通常是不准确的。尝试改进您的帖子并使用精确的 FP 值,例如 0.125、0x1234p-4、...问你问题。我想你会发现你关心的不是加法,而是代码转换。0.4doubledouble

答: 暂无答案