gcc 编译器是否尊重我代码中所写的表达式形式?
Does the gcc compiler respect the form of expressions as written in my code?
比如我用c写了一个表达式
a = (((b+c) / d) / f) + ((3.14 * e) ) / f) ;
这里a,b,c,d,e,f都是双精度变量。例如,当我使用具有某些优化设置的 gcc 编译器编译我的代码时,编译器会遵循我编写的表达式的特定形式,还是会修改表达式以使代码 运行 更快?例如,使用 -O2 优化设置的 would/could gcc 将上述表达式编译为
a = ((b+c + 3.14* d * e) / (d*f))
还是保持原样?我担心编译器会改变我的方程式,这可能会影响我的表达式的数值稳定性。
编译器保证生成的表达式产生的结果与对编写的公式求值的结果相同。这包括表达式可能产生的所有类型转换、副作用和异常。
特别是,您优化表达式的方法不会通过等价性测试,因为原始表达式中的 ((b+c) / d)
将根据 b
、[=12= 的类型进行评估],以及 d
,可以是 int
或 float
;另一方面,由于添加了 3.14
,您的第二个(优化的)公式会在整个表达式上强制使用 double
类型。它还将分子中的 e
乘以 d
以补偿分母中的 d*f
,这可能会产生原始公式中不存在的溢出
比如我用c写了一个表达式
a = (((b+c) / d) / f) + ((3.14 * e) ) / f) ;
这里a,b,c,d,e,f都是双精度变量。例如,当我使用具有某些优化设置的 gcc 编译器编译我的代码时,编译器会遵循我编写的表达式的特定形式,还是会修改表达式以使代码 运行 更快?例如,使用 -O2 优化设置的 would/could gcc 将上述表达式编译为
a = ((b+c + 3.14* d * e) / (d*f))
还是保持原样?我担心编译器会改变我的方程式,这可能会影响我的表达式的数值稳定性。
编译器保证生成的表达式产生的结果与对编写的公式求值的结果相同。这包括表达式可能产生的所有类型转换、副作用和异常。
特别是,您优化表达式的方法不会通过等价性测试,因为原始表达式中的 ((b+c) / d)
将根据 b
、[=12= 的类型进行评估],以及 d
,可以是 int
或 float
;另一方面,由于添加了 3.14
,您的第二个(优化的)公式会在整个表达式上强制使用 double
类型。它还将分子中的 e
乘以 d
以补偿分母中的 d*f
,这可能会产生原始公式中不存在的溢出