kahan求和算法的原理
[
kahan的基本原理就是就是:人为的保存较大数和较小数相加过程中,较小数丢失的有效数字。
用几个10进制的数相加作为例子:
a = {12345.6, 0.123456, 12.3456}, 它们加起来应该是12358.069056,但是实际情况下得不到这个结果
(1)直接相加
如果有一台计算机,它只能计算到6位有效数字,那么:
a[0] + a[1] 为 12345.6 + 0.123456 = 12345.7 ,误差为0.023456 (a[1]的后面几个数字丢失)
再加a[2] 为 12345.7 + 12.3456 = 12358.0, 误差又增加了0.0456(a[2]的后几个数字丢失)
最后结果12358.0距离正确结果12358.069056,误差了0.069056
(3)如果用kahan算法来加, 同样是在这台只有6位有效数字的机器上:
float sum=0.0f;
float c=0.0f; //补偿丢失的有效数字
for(int i=0;i<3;i++)
{
float sum0 = sum;
float t = a[i] + c;
sum += t;
c = t - (sum - sum0) ; //这里得到了丢失的有效数字
}
sum += c; //剩余补偿
循环i=0, 和sum = 12345.6, 补偿c=0.0
循环i=1, 和sum = 12345.7, 补偿c=0.023456
循环i=2, 和sum= 12358.1, 补偿c=-0.030944
然后退出循环,再加上剩余的补偿,就比直接相加更精确了。
这只是一个例子。实际上kahan’s formula很精确了。。。[/i]
您真是热心的会员啊
[
您也很热心啊!