加法在数学上具有结合律:
(a + b) + c = a + (b + c)
在一般情况下,此属性不适用于浮点数,因为它们表示有限精度的值。
作为优化的一部分,从 C 程序生成机器代码时,编译器是否允许进行上述替换? C标准中到底在哪里说的?
不允许编译器执行“优化”,这将导致计算出的值与根据抽象机器语义计算出的值不同。
5.1.2.3 程序执行
[#1] 本国际中的语义描述
标准描述了抽象机的行为
哪些优化问题是无关紧要的。
[#3] 在抽象机中,所有表达式都会被求值
正如语义所指定的。
[#13] 示例 5 浮点表达式的重新排列
由于精度的限制,经常受到限制
以及范围。该实施不能普遍适用
加法或加法的数学关联规则
乘法,也不是分配规则,因为
即使没有溢出和舍入误差
下溢。
在你的例子中:
(a + b) + c
甚至没有括号:
a + b + c
we have
+
/ \
+ c
/ \
a b
并且编译器需要生成代码,就像a
总结为b
结果总结为c
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)