舍入错误:总和

时间:2012-05-23 18:24:04

标签: c math floating-point

我有一张大学powerpoint幻灯片声称要做一个像

这样的继承的总和

1 / i ^ 2

索引“i”从0到2260,不同于做相同数字的总和但从最大到最小(从1/2260 ^ 2到1/0 ^ 2)。< / p>

尝试在C上执行此操作,我有以下结果:

Increasing Order Sum: 1.644491e+00.
Decreasing Order Sum: 1.644491e+00.
Relative Error (abs(Incr. Sum - Decr. Sum) / abs(Incr. Sum)) : 2.700465e-15.

有人可以解释一下为什么会这样吗?我在这些幻灯片上没有解决方案。

提前致谢! :)

1 个答案:

答案 0 :(得分:6)

通常,浮点加法不是associative。换句话说,(a + b) + c不一定与a + (b + c)相同。

要了解原因,请尝试运行此代码:

float a = 1e9;
float b = 1;
a += b;
printf("%f\n", a);

然后考虑如果将b添加到a 100万次会发生什么。然后考虑如果你交换操作会发生什么(即最后添加1e9)。