2011-07-29 51 views
4

從一個浮點數中減去一個數組時,我遇到了python自動舍入很小數字(小於1e-8)的問題。以這個例子:在Python中減去numpy數組時發生不必要的四捨五入

import numpy as np 
float(1) - np.array([1e-10, 1e-5]) 

任何想法如何強制蟒蛇不輪?這迫使我在某些情況下除以零,併成爲一個問題。從numpy數組中減去時會出現同樣的問題。

+0

我有同樣的問題提高1的冪小數,並將它們舍入爲0. – mike

+1

奇怪,你得到downvote ...這是一個很好的問題,i.m.o. –

回答

6

大多數情況下,它只是無所事事浪費你numpy的陣列的repr

考慮你上面的例子:

import numpy as np 
x = float(1) - np.array([1e-10, 1e-5]) 
print x 
print x[0] 
print x[0] == 1.0 

這產生了:

[ 1.  0.99999 ] 
0.99999999999 
False 

所以第一個元素是不實際爲零,它只是numpy的陣列的漂亮打印一下顯示這種方式。

這可以通過numpy.set_printoptions.

當然,numpy的是fundementally利用有限的精度浮點值來控制。 numpy的全部要點是爲類似數據的數組提供一個內存高效的容器,所以在numpy中沒有相應的類。

然而,64位浮點數有一個不錯的精度範圍。 1e-10和1e-5不會造成太多問題。如果你需要,還有一個numpy.float128 dtype,但操作將比使用本地浮點數慢得多。

+0

我沒有想到這一點,但你是絕對正確的..永遠不要相信僅僅是一些東西的表示! +1 – redShadow

1

我想所有依賴於非常小的浮點數的處理,由Python和底層的C庫,在某一點往往會失去精度。

如果你需要的精度,恕我直言,你應該依賴於不同的東西,比如斷片的數量等該級別

我不知道是否已經有東西來處理,但如果你能設法以不同的方式表示數字(例如1/100000000001/100000),然後僅在所有計算結束時計算浮點結果,則應避免所有這些問題。

(當然,你需要一些類,自動地處理斷片的計算,以避免重新實現公式等)