Capisco in che modo le operazioni matematiche matematicamente equivalenti possono produrre risultati diversi a causa di errori numerici (ad esempio, sommare i float in ordini diversi).Comportamento strano numpy.sum quando si aggiungono gli zeri
Tuttavia, mi sorprende che l'aggiunta di zeri a sum
può modificare il risultato. Ho pensato che questo vale sempre per i galleggianti, non importa quale: x + 0. == x
.
Ecco un esempio. Mi aspettavo che tutte le linee fossero esattamente a zero. Qualcuno può spiegare perché questo accade?
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
Sembra non accada per i valori minori di M
e Z
.
Mi sono anche assicurato che a.dtype==b.dtype
.
Ecco un altro esempio, che dimostra anche incorporate sum
si comporta di pitone come previsto:
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
sto usando v1.9.2 NumPy.
Posso riprodurre con 1.9.2, ma non con 1.6.1. La mia ipotesi sarebbe che l'array più lungo in qualche modo fa sì che gli elementi vengano aggiunti in un ordine diverso, ad esempio per facilitare SMID. – amaurea
Anche con '' math.fsum() '', che è diverso da '' sum() '', sembra non accadere (almeno in 2.7.x). –
Mi azzarderei a indovinare che è la sommatoria pairwise, https://github.com/numpy/numpy/pull/3685 –