2017-04-04 61 views
8

我使用numpy的這樣的代碼NumPy的是計算錯誤

>>>import numpy as np 
>>>a=np.arange(1,100000001).sum() 
>>>a 
987459712

我猜的結果必然是有些像 50000000.5億

我注意到,直到五個數字的結果是正確的。 有人知道發生了什麼事嗎?

關於

+0

NP A = np.arange(1,100000001)的.sum() –

+0

編輯您的問題,包括代碼正確格式化(上新高的部分代碼line並點擊'ctrl' +'k' – MooingRawr

+0

無法在python 2.7中使用[email protected]或python3.5和[email protected]重現。你在用什麼? – Jblasco

回答

8

Numpy在這裏沒有犯錯誤。這種現象被稱爲integer overflow

x = np.arange(1,100000001) 
print(x.sum()) # 987459712 
print(x.dtype) # dtype('int32') 

arange用於給定的輸入根本無法保持5000000050000000.最多它可以採取2147483647 32位的整數類型。

如果您明確使用較大的整數或浮點數據類型,您會得到預期的結果。

a = np.arange(1, 100000001, dtype='int64').sum() 
print(a) # 5000000050000000 

a = np.arange(1.0, 100000001.0).sum() 
print(a) # 5000000050000000.0 
+0

對我來說這聽起來像一個「錯誤」,尤其是如果需要使用長整數的Python。當然'numpy'自己做算術,但作爲一個數字包,它應該更好處理計算,而不是更糟。 – alexis

+0

@alexis我不認爲這是一個錯誤,因爲它是有記錄的行爲。文檔說默認'arange'從輸入中推斷數據類型。由於'100000001'足夠小,使用'int32'似乎是合理的。實際上,由於我使用32位Python並使用整數數組作爲索引,所以我很欣賞它默認使用指針大小的數據類型。 – kazemakase

5

我懷疑你使用的是Windows,其中結果的數據類型是一個32位整數(同時使用,也就是說,Mac OS X或Linux的那些數據類型爲64位)。需要注意的是5000000050000000 % (2**32) = 987459712

嘗試使用

a = np.arange(1, 100000001, dtype=np.int64).sum() 

a = np.arange(1, 100000001).sum(dtype=np.int64) 

附:任何人都沒有使用Windows可以重現的結果如下:

>>> np.arange(1, 100000001).sum(dtype=np.int32) 
987459712 
+0

不錯的觀察,這是Windows特定的! – kazemakase

+0

傳送你這麼多!解決了我的問題! –