有人可以向我解释为什么这些在 IEEE 754 浮点中不相等:
(1 + 1e300) - 1e100 and 1 + (1e300 - 1e100)
非常感谢!
有人可以向我解释为什么这些在 IEEE 754 浮点中不相等:
(1 + 1e300) - 1e100 and 1 + (1e300 - 1e100)
非常感谢!
这取决于您使用的IEEE 浮点格式以及您使用的舍入模式。
F64
上面说它们相等的注释很可能以至少双精度(F64 二进制)进行检查,例如 RNE 舍入。double
这是在类 C 语言中使用时通常会发生的情况。
在这种情况下,您的所有数字都会被转换并四舍五入为 F64 值。其他数字与 1e300 相差甚远,任何加法都将返回到大约 1e300。要以小数显示这个数字,它会再次四舍五入并显示为 1e300。
如果您的舍入模式不是 RNE,您的最终答案可能与 1e300 略有不同,但可能仍然相同。
F32
但是,如果您以单精度 (F32) 工作 - 您的大多数数字都太大而无法表示,并且可能会转换为Inf
.
遵循 IEEE 745 规则:您最终Inf-Inf
在两种情况下都进行计算,结果应该是NaN
. 最后,如果您最终将值比较为 floats: NaN==NaN
,则答案必须是false
,这似乎与您所看到的一致。
对于 Python,
>>> (1 + 1e300) - 1e100 == 1 + (1e300 - 1e100)
True