我了解数学上等效的算术运算如何由于数值错误(例如以不同顺序求和浮点数)而导致不同的结果。
然而,令我惊讶的是,添加零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。