我正在使用补偿求和来实现一种算法,以减少累加误差累加量。我想知道我是否可以告诉编译器不要在代码的一个特定部分优化浮点运算。更准确地说,我想保持操作的顺序。以下是示例代码段(所有变量均为double
):
while(1){
a = y;
e = e + d;
y = a + e;
e = e + (a - y);
}
我担心最后一行可以优化来阅读e=e-e
或e = (e+a)-y
。在哪种情况下会发生这种情况,我该如何预防?
答案 0 :(得分:8)
如果编译器声称符合IEEE 754标准,那么它必须完全按照您编写的方式执行操作 - 除非它能证明结果是相同的(在这种情况下,不同的计算不会对您造成伤害)。
有时,如果允许编译器提供稍微不同的结果,这会使代码运行速度变慢。而且有些编译器可以选择允许编译器进行那种优化。如果您的编译器具有此类选项,则需要将其关闭。
编译器必须尊重括号。例如,在“e = e +(a-y);”中必须从a中减去y,将结果添加到e,并将总和存储到e中。
答案 1 :(得分:1)
没有严格的标准方法来阻止优化(一般情况下)。但是,如果使用最近的GCC编译器,则可以使用#pragma GCC optimize或optimize
function attribute。
-fdump-tree-*
),或者使用生成的汇编程序代码(使用-fverbose-asm
来获取更易读的汇编程序ode)。