在c中阻止对一个操作的优化

han*_*nno 0 c floating-point c99

我正在使用补偿求和来实现一种算法,以减少累加误差累加量.我想知道我是否可以告诉编译器不要在代码的一个特定部分优化浮点运算.更确切地说,我想保持操作的顺序.这是一个示例代码片段(所有变量都是double):

while(1){
    a = y;
    e = e + d;
    y = a + e;
    e = e + (a - y);
}
Run Code Online (Sandbox Code Playgroud)

我担心最后一行可以优化读取e=e-ee = (e+a)-y.在哪种情况下会发生这种情况,我该如何预防呢?

gna*_*729 8

如果编译器声称符合IEEE 754标准,那么它必须完全按照您编写的方式执行操作 - 除非它能证明结果是相同的(在这种情况下,不同的计算不会对您造成伤害).

有时这会使代码运行速度慢于允许编译器给出略微不同的结果.而且有些编译器可以选择允许编译器进行那种优化.如果您的编译器具有此类选项,则需要将其关闭.

编译器必须遵守括号.例如,在"e = e +(a-y);"中 它必须从a中减去y,将结果添加到e,并将总和存储到e中.

  • 即使没有括号,C标准也不允许这种优化(不需要诉诸IEEE-754). (3认同)
  • @hanno是的,GCC包含一些违反C规范的优化选项,并且由于这个原因在所有`-O`优化级别上默认禁用.其中大多数都可以使用`-ffast-math`选项打开. (3认同)