Странное поведение numpy.sum при добавлении нулей

Я понимаю, как математически эквивалентные арифметические операции могут приводить к различным результатам из-за числовых ошибок (например, суммирование операций с плавающей точкой в ​​разных порядках).

Тем не менее, меня удивляет, что добавление нулей в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.

Вот еще один пример, который также демонстрирует встроенную в Pythonsum ведет себя как ожидалось:

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)

Ваш ответ на вопрос