对于浮点值,是否保证与1a + b
相同? b + a
我相信这在 IEEE754 中得到了保证,但是 C++ 标准并未指定必须使用 IEEE754。唯一相关的文本似乎来自 [expr.add]#3:
二元 + 运算符的结果是操作数的和。
数学运算“和”是可交换的。然而,数学运算“sum”也是关联的,而浮点加法绝对不是关联的。因此,在我看来,我们不能得出结论,数学中“sum”的交换性意味着这句话指定了 C++ 中的交换性。
脚注 1:
与按位相同的“相同”,例如memcmp
而不是==
,以区分 +0 和 -0。IEEE754 将+0.0 == -0.0
其视为真,但也有符号零的特定规则。 +0 + -0
并且-0 + +0
两者都+0
在 IEEE754 中产生,对于添加具有相等幅度的相反符号值也是如此。如果==
这是标准,那么遵循 IEEE 语义的一个将隐藏有符号零的非交换性。
此外,a+b == b+a
如果任一输入为 NaN,则 IEEE754 数学为假。
memcmp
将说明两个 NaN 是否具有相同的位模式(包括有效负载),尽管我们可以将 NaN 传播规则与有效数学运算的交换性分开考虑。