数学的に同等の算術演算が、数値エラー (たとえば、浮動小数点数を異なる順序で合計するなど) によって異なる結果になる可能性があることを理解しています。
ただし、ゼロを追加する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
ました。
もう 1 つの例を次に示します。これは、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 を使用しています。