在C ++中浮点加法是否可交换?
对于浮点值,保证a + b == b + a
?
我相信这在IEEE754中是有保证的,但是C ++标准没有规定必须使用IEEE754。 唯一相关的文本似乎来自[expr.add]#3:
二元运算符的结果是操作数的总和。
math运算“sum”是可交换的。 然而,math运算“sum”也是联想的,而浮点加法绝对不是联想的。 所以,在我看来,我们不能断定math中“sum”的交换性意味着这个引用在C ++中指定了交换性。
甚至不需要a + b == a + b
。 其中一个子expression式可能比另一个子expression式更加精确地保存加法结果,例如,当多次加法的使用要求其中一个子expression式被临时存储在内存中时,另一个子expression式可以保存在一个寄存器中精度更高)。
如果a + b == a + b
不能保证,则a + b == b + a
不能保证。 如果a + b
不必每次都返回相同的值,而且这些值是不同的,其中一个必然不会等于b + a
一个特定评估。
不,C ++语言通常不会对硬件做出这样的要求。 只定义运营商的关联性。
在浮点运算中发生各种疯狂的事情。 也许,在某些机器上,将一个非正规数加0就会产生零。 可以想象,一台机器可以避免在向存储器中的非规范化添加零值寄存器的情况下更新存储器。 可能一个非常愚蠢的编译器总是把LHS放在内存中,而RHS放在一个寄存器里。
但是,请注意,如果您要控制您获得的操作,那么具有非交换加法的计算机将需要专门定义expression式如何映射到指令。 左侧是进入第一台机器操作数还是第二台?
这样一个ABI规范,提到同一口气中的expression和指令的构build,将是相当病态的。
C ++标准并不保证IEEE 754.该库对IEC 559(基本上只是IEC 754标准的IEC版本)有一些支持,所以你可以检查底层实现是否使用IEEE 754 / IEC 559 (当然,当然,你可以依赖于它的保证)。
在大多数情况下,C和C ++标准假设这些基本操作将被实现,然而底层硬件工作。 对于IEEE 754这样常见的东西,他们会让你检测它是否存在,但是仍然不需要它。