Kahan求和算法在GCC编译时存在较大的计算错误
Kahan summation algorithm has big computing error when it is compiled by GCC
我使用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;
}
如果使用 MSV 编译它,它可以正常工作,但是当我使用 GCC 时,它有一个很大的计算错误。
这里的麻烦在哪里?
我假设,这是积极的编译器优化的结果。因此,GCC 可以将表达式从:
float term = value - correction;
float temp = sum + term;
correction = (temp - sum) - term;
sum = temp;
自
float term = value - correction;
correction = 0;
sum += term;
因为这种转换在数学上是正确的,但这种优化杀死了卡汉算法。
为了避免这个问题,您可以使用"-O1"GCC编译器选项来编译代码。它将是这样的:
#if defined(__GNUC__)
# pragma GCC push_options
# pragma GCC optimize ("O1")
#endif
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;
}
#if defined(__GNUC__)
# pragma GCC pop_options
#endif
相关文章:
- 我的字符计数代码计算错误.为什么
- 为什么 2 个双精度值之间的差值计算错误?
- C++ openmp 并行计算计算错误的结果
- Qt qreal计算错误
- C 并行矩阵乘法,计算错误
- Arduino计算错误 - 不应该时给出负值
- 当尺寸变大时,会出现矩阵计算错误
- C++ if 语句数学计算错误
- 浮点数的不准确导致计算错误
- 优化标志会导致计算错误
- Kahan求和算法在GCC编译时存在较大的计算错误
- 为什么在函数中传递参数时会出现算术计算错误
- 增加数组大小时 CUDA 主体磁贴计算错误代码 77
- OpenGL漫射照明计算错误
- 具有参数计算错误的重载函数
- 我的程序中有计算错误吗
- 在C++中使用ceil函数时出现计算错误
- 模拟读数计算错误
- struct和time_t的计算错误
- Pow()计算错误