【发布时间】:2016-05-27 14:37:24
【问题描述】:
我使用Kahan求和算法:
inline void KahanSum(float value, float & sum, float & correction)
{
float term = value - correction;
float temp = sum + term;
correction = (temp - sum) - term;
sum = temp;
}
float KahanSum(const float * ptr, size_t size)
{
float sum = 0, correction = 0;
for(size_t i = 0; i < size; ++i)
KahanSum(ptr[i], sum, correction);
return sum;
}
如果使用MSVS编译的话可以正常使用,但是使用GCC的时候会出现很大的计算错误。
问题出在哪里?
【问题讨论】:
-
你说的我使用GCC时出现大计算错误是什么意思?能详细点吗?
-
显示编译器标志和生成的汇编代码
-
我们可以自己获取汇编代码。为了能够回答这个问题,我们真正需要的是一些样本输入和预期输出。以及您看到的错误消息(如果有)。比如,您可能忘记包含定义
size_t的标准库头文件? -
维基页面有一个很好的评论:“小心过度激进的优化编译器!”可能你应该减少这部分代码的优化。