c++ - C++中的浮点加法是否可交换?

标签 c++ floating-point language-lawyer commutativity

对于浮点值,是否保证a + b1 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/

相关文章:

c - "too large"对象是否具有自动存储持续时间未定义的行为?

c++ - 如果对可推导类型进行替换,可变参数模板类型推导会使编译器崩溃

c++ - 写一个像 Vector.at() 这样的方法

c++ - IXSomething 与 ISomething

c++ - 模板函数中默认参数的实例化点

c - 如何将 float 分成整数和小数部分?

c - 给定 float 时如何避免 FPU?

c++ - 以排序方式插入节点时遇到问题

c++ - 检查对象类型真的总是糟糕设计的标志吗?

c - 互补误差函数 erfcf() 的矢量化实现