繁体   English   中英

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

[英]Is floating point addition commutative in C++?

对于浮点值,是否保证a + b == b + a

我相信这在IEEE754中是有保证的,但是C ++标准没有规定必须使用IEEE754。 唯一相关的文本似乎来自[expr.add]#3:

binary +运算符的结果是操作数的总和。

数学运算“和”是可交换的。 然而,数学运算“sum”也是关联的,而浮点加法肯定不是关联的。 所以,在我看来,我们不能断定数学中“和”的交换性意味着这个引用指的是C ++中的交换性。

不,C ++语言通常不会对硬件提出这样的要求。 仅定义了运算符的关联性。

浮点运算中确实发生了各种疯狂的事情。 也许,在某些机器上,将零加到非正规数会产生零。 可以想象,在将零值寄存器添加到存储器中的非正规的情况下,机器可以避免更新存储器。 可能是一个非常愚蠢的编译器总是将LHS放在内存中并将RHS放在寄存器中。

但请注意,如果您要对所获得的操作进行任何控制,那么具有非交换添加的计算机将需要专门定义表达式如何映射到指令。 左侧是进入第一个机器操作数还是进入第二个机器操作数?

这样的ABI规范,提到同一口气中的表达和指令的构造,将是非常病态的。

甚至不要求a + b == a + b 其中一个子表达式可以比另一个子表达式更精确地保持加法结果,例如当使用多个加法项时需要将其中一个子表达式临时存储在存储器中,而另一个子表达式可以保存在寄存器中(精度更高)。

如果a + b == a + b没有保证, a + b == b + a 不能保证。 如果a + b每次不必返回相同的值,并且值不同,则其中一个必然不等于b + a一个特定评估。

C ++标准非常明确保证IEEE 754.库确实有IEC 559(这基本上只是IEC的IEEE 754标准版)的一些支持,所以您可以检查底层的实现是否使用IEEE 754 / IEC 559虽然(当它发生时,你可以依赖它保证的东西)。

在大多数情况下,C和C ++标准假定这些基本操作将被实现,但底层硬件可以工作。 对于像IEEE 754这样常见的东西,它们会让你检测它是否存在,但仍然不需要它。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM