对于浮点数而言, a + b
等价于1 b + a
是否是有保证的?
我相信在IEEE754中这是有保证的,但C++标准并没有规定必须使用IEEE754。唯一相关的文本似乎来自[expr.add]#3:
二元+运算符的结果是操作数的总和。
数学运算“总和”是可交换的。然而,数学运算“总和”也是可结合的,而浮点加法明显不是可结合的。因此,我认为我们不能得出“总和”在数学上具有交换性意味着该引用指定了C ++中的交换性。
注脚1:
“同一”的含义是按位相同,类似于memcmp
而不是==
,以区分+0和-0。 IEEE754将+0.0 == -0.0
视为真,但也针对有符号零制定了特定规则。 IEEE754中+0 + -0
和-0 + +0
都产生+0
,相等大小反号值的加法也是如此。如果遵循IEEE语义的==
将隐藏有符号零的非交换性,如果这是标准。
此外,在IEEE754数学中,如果任何输入为NaN,则a + b == b + a
是错误的。
memcmp
将说两个NaN是否具有相同的位模式(包括有效负载),尽管我们可以将NaN传播规则单独考虑,而不涉及有效的数学运算的交换性。
std::strtod("nan")+0.0 == 0.0+std::strtod("nan")
的结果为 false。但我怀疑这不是你想要表达的意思。 - ascheplera+b == b+a
是否相同于询问它是否可交换是不同的,因为==
与memcmp
不同。在类似 IEEE754 的系统中,最可能的非交换性,比如一些软件浮点数模拟器,可能是由于带符号零或不同的 NaN 负载。(例如,0 + -0
可能总是采用左操作数的符号,而在 IEEE754 中总是+0
)。但它仍然可能实现-0 == +0
的 IEEE 语义。(此外,如果 a 或 b 是 NaN,则对于 IEEE754,a+b == b+a
为 false。再次提醒,memcmp
实际上会检查可交换性)。 - Peter Cordes--fast-math
或-Ofast
,在这种情况下可能会发生任何事情。 - alfC