我明白在数值计算中,等价的数学运算可能由于数字误差而导致不同的结果(例如以不同的顺序对浮点数求和)。
然而,令我惊讶的是将零添加到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。
math.fsum()
和sum()
,它们是不同的函数,至少在2.7.x版本中似乎不会发生这种情况。 - Armin Rigo