舍入错误:总和

wir*_*ark 1 c math floating-point

我有一个大学powerpoint幻灯片声称做了一个继承的总和

1/i ^ 2

索引"i"从0到2260,不同于做相同数字的总和但从最大到最小(从1/2260 ^ 2到1/0 ^ 2).

试图在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.
Run Code Online (Sandbox Code Playgroud)

有人能解释我为什么会这样吗?我对这些幻灯片没有解决方案.

提前致谢!:)

Oli*_*rth 6

因为浮点加法通常不是关联的.换句话说,(a + b) + c不一定相同a + (b + c).

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

float a = 1e9;
float b = 1;
a += b;
printf("%f\n", a);
Run Code Online (Sandbox Code Playgroud)

然后考虑如果添加会发生什么b,以a100万次.然后考虑如果你交换操作会发生什么(即最后添加1e9).