Kahan's Summation Formula为什么能提高计算精度

来源:百度知道 编辑:UC知道 时间:2024/06/21 18:13:45

#include <stdio.h>
int main(int argc, char* argv[])
{
int i;
float x=0.001f;
float y;
float t;
float sum;
float eps=0;

printf("\n理论值:%f\n",x*1000000);

sum=0.0f;
for(i=0;i<1000000;i++)
{
sum+=x;
}
printf("\n累加值:%f\n",sum);

sum=0.0f;
for(i=0;i<1000000;i++)
{
y=x-eps;
t=sum+y;
eps=(t-sum)-y;
sum=t;
}
printf("\nKahan累加值:%f\n",sum);

return 0;
}

对于N个0.001,普通方法累加到991左右就已经丢失精度了。可以看到用“Kahan method”能够得到近乎于理论的精度数值。分析一下他的原理。我们发现,如果没有精度损失,eps永远为0,y就是ELEMENT=0.001。一旦在 i 到了某个数值出现了大数吃小数 的情形时,不妨激进的设小数部分全部被截断,则如s = 991.0000时,由于eps之前为0,则y=0.0010.之后t=s+y,得到的就是“吃掉”的结果,如991.0000,绝对误差达0.001.此时:eps=(t-s)-y=(991.0000-991.0000)-0.0010=-0.001,可见eps起了保存“损失位”的作用。此时s=t=991.0000.下个循环:y = 0.001--0.001=0.002,t = s+y=991.0000,eps=-0.002,如此反复,这样足够多循环后,eps足可以复现大的校正值,从而保证结果的高精度。当eps足够大时候,(t-s