这不是NumPy问题,它是一个浮点问题. C中也是如此:
float acc = 0;
for (int i = 0; i < 1024*1024; i++) {
acc += 30504.00005f;
}
acc /= (1024*1024);
printf("%f\n",acc); // 30687.304688
问题是浮点精度有限;随着累加器值相对于添加到其中的元素的增长,相对精度会下降.
一种解决方案是通过构造加法器树来限制相对增长.这是C中的一个例子(我的Python不够好……):
float sum(float *p,int n) {
if (n == 1) return *p;
for (int i = 0; i < n/2; i++) {
p[i] += p[i+n/2];
}
return sum(p,n/2);
}
float x[1024*1024];
for (int i = 0; i < 1024*1024; i++) {
x[i] = 30504.00005f;
}
float acc = sum(x,1024*1024);
acc /= (1024*1024);
printf("%f\n",acc); // 30504.000000