0

有人可以向我解释为什么这些在 IEEE 754 浮点中不相等:

(1 + 1e300) - 1e100 and 1 + (1e300 - 1e100) 

非常感谢!

4

2 回答 2

0

这取决于您使用IEEE 浮点格式以及您使用的舍入模式。

F64

上面说它们相等的注释很可能以至少双精度(F64 二进制)进行检查,例如 RNE 舍入。double这是在类 C 语言中使用时通常会发生的情况。

在这种情况下,您的所有数字都会被转换并四舍五入为 F64 值。其他数字与 1e300 相差甚远,任何加法都将返回到大约 1e300。要以小数显示这个数字,它会再次四舍五入并显示为 1e300。

如果您的舍入模式不是 RNE,您的最终答案可能与 1e300 略有不同,但可能仍然相同。

F32

但是,如果您以单精度 (F32) 工作 - 您的大多数数字都太大而无法表示,并且可能会转换为Inf.

遵循 IEEE 745 规则:您最终Inf-Inf在两种情况下都进行计算,结果应该是NaN. 最后,如果您最终将值比较为 floats: NaN==NaN,则答案必须是false,这似乎与您所看到的一致。

于 2016-10-05T14:33:13.750 回答
0

对于 Python,

>>> (1 + 1e300) - 1e100 == 1 + (1e300 - 1e100)
True
于 2020-10-14T04:52:31.383 回答