【发布时间】:2015-06-23 09:00:24
【问题描述】:
我了解数学上等效的算术运算如何由于数值错误(例如,以不同顺序求和浮点数)而导致不同的结果。
然而,令我惊讶的是,在sum 中添加零会改变结果。我认为这始终适用于浮点数,无论如何:x + 0. == x。
这是一个例子。我希望所有的行都完全为零。谁能解释一下为什么会这样?
M = 4 # number of random values
Z = 4 # number of additional zeros
for i in range(20):
a = np.random.rand(M)
b = np.zeros(M+Z)
b[:M] = a
print a.sum() - b.sum()
-4.4408920985e-16
0.0
0.0
0.0
4.4408920985e-16
0.0
-4.4408920985e-16
0.0
0.0
0.0
0.0
0.0
0.0
0.0
0.0
2.22044604925e-16
0.0
4.4408920985e-16
4.4408920985e-16
0.0
M 和 Z 的较小值似乎不会发生这种情况。
我还确定了a.dtype==b.dtype。
这里还有一个例子,它也演示了 python 的内置 sum 的行为符合预期:
a = np.array([0.1, 1.0/3, 1.0/7, 1.0/13, 1.0/23])
b = np.array([0.1, 0.0, 1.0/3, 0.0, 1.0/7, 0.0, 1.0/13, 1.0/23])
print a.sum() - b.sum()
=> -1.11022302463e-16
print sum(a) - sum(b)
=> 0.0
我正在使用 numpy V1.9.2。
【问题讨论】:
-
我可以用 1.9.2 复制,但不能用 1.6.1。我的猜测是较长的数组会以某种方式导致元素以不同的顺序添加,例如为了促进 SMID。
-
与
math.fsum()一样,这与sum()不同,它似乎不会发生(至少在2.7.x 中)。 -
我大胆猜测它是成对求和,github.com/numpy/numpy/pull/3685
-
无法用 python 2.7.6 和 numpy 1.8.0 重现
-
在 python 2.7.5 和 numpy 1.6.2 上也无法重现
标签: python numpy sum numerical-stability