【发布时间】:2014-10-04 10:25:24
【问题描述】:
我正在使用补偿求和来实现一种算法,以减少累加的舍入误差。我想知道是否可以以某种方式告诉编译器不要优化代码的某个特定部分中的浮点运算。更准确地说,我想保留操作顺序。这是一个示例代码sn-p(所有变量都是double):
while(1){
a = y;
e = e + d;
y = a + e;
e = e + (a - y);
}
我担心最后一行可能会被优化以读取e=e-e 或e = (e+a)-y。在什么情况下会发生这种情况,我该如何预防?
【问题讨论】:
-
它真的得到优化了吗?通常,编译器不会使用正常的数学属性来优化浮点运算因为您提到的舍入错误。
-
这正是我想知道的。括号是否足以防止编译器重新排列浮点运算?
-
AFAIK 即使没有括号,它也不会优化/重新排列。
标签: c floating-point c99