对于浮点值,是否保证a + b
与1 b + a
相同?
我相信这在 IEEE754 中得到了保证,但是 C++ 标准并未指定必须使用 IEEE754。唯一相关的文字似乎来自 [expr.add]#3:
The result of the binary + operator is the sum of the operands.
数学运算“sum”是可交换的。然而,数学运算“sum”也是关联的,而浮点加法绝对是not关联的。因此,在我看来,我们不能得出结论,数学中“sum”的交换性意味着这句话指定了 C++ 中的交换性。
脚注 1:
与按位相同的“相同”,例如 memcmp
而不是 ==
,以区分 +0 和 -0。 IEEE754 将 +0.0 == -0.0
视为真,但也对有符号零有特定规则。 +0 + -0
和 -0++0
在 IEEE754 中都产生 +0
,对于添加具有相等幅度的相反符号值也是如此.遵循 IEEE 语义的 ==
将隐藏有符号零的非交换性(如果这是标准)。
此外,如果任一输入为 NaN,则 a+b == b+a
在 IEEE754 数学中为假。
memcmp
将说明两个 NaN 是否具有相同的位模式(包括有效负载),尽管我们可以将 NaN 传播规则与有效数学运算的交换性分开考虑。
最佳答案
甚至不需要a + b == a + b
.其中一个子表达式可以比另一个更精确地保存加法的结果,例如,当使用多个加法需要将其中一个子表达式临时存储在内存中时,当另一个子表达式可以保存在寄存器中时 (精度更高)。
如果 a + b == a + b
不保证,a + b == b + a
不能保证。如果 a + b
不必每次都返回相同的值,并且值不同,其中一个必然不等于 b + a
的一个特定评估.
关于c++ - C++中的浮点加法是否可交换?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24442725/