2

假设我用 c 写了一个表达式,例如

a = (((b+c) / d) / f) + ((3.14 * e) ) / f) ;

这里 a,b,c,d,e,f 都是双精度变量。例如,当我使用带有一些优化设置的 gcc 编译器编译代码时,编译器是否尊重我编写的表达式的特定形式,还是修改表达式以使代码运行得更快?例如,带有 -O2 优化设置的 gcc 是否可以将上述表达式编译为

a = ((b+c + 3.14* d * e) / (d*f))

或者它会保持表达式不变?我担心编译器会改变我的方程式的形式,这可能会影响我的表达式的数值稳定性。

4

1 回答 1

2

编译器保证生成一个表达式,该表达式会在编写公式时产生与计算公式相同的结果。这包括表达式可能产生的所有类型转换、副作用和异常。

特别是,您优化表达式的方法不会通过等价性测试,因为((b+c) / d)在原始表达式中将根据 , 和 的类型进行评估bc可能dintor float; 另一方面,您的第二个(优化的)公式double由于添加了3.14. 它还乘以e分子d以补偿d*f分母,这可能会产生原始公式中不存在的溢出。

于 2018-03-07T21:49:23.753 回答