打印值不正確。在使用float64
時,y
小於1
,在使用float32
時大於或等於1
。這是預期的,因爲舍入誤差取決於float
的大小。
爲了避免這種問題,在處理浮點數時,您應該總是決定一個「最小誤差」,通常稱爲epsilon
,而不是比較相等性,檢查結果是否距目標最遠epsilon
值:
In [13]: epsilon = 1e-11
In [14]: number = np.float64(1) - 1e-16
In [15]: target = 1
In [16]: abs(number - target) < epsilon # instead of number == target
Out[16]: True
特別地,numpy
已經提供np.allclose
其可以是比較對於給定某個容差平等陣列有用的。即使參數不是數組(例如,np.allclose(1 - 1e-16, 1) -> True
),它也可以工作。
但是,請注意,numpy.set_printoptions
不會影響如何打印np.float32
/64
。它僅影響如何陣列印:
In [1]: import numpy as np
In [2]: np.float(1) - 1e-16
Out[2]: 0.9999999999999999
In [3]: np.array([1 - 1e-16])
Out[3]: array([ 1.])
In [4]: np.set_printoptions(precision=16)
In [5]: np.array([1 - 1e-16])
Out[5]: array([ 0.9999999999999999])
In [6]: np.float(1) - 1e-16
Out[6]: 0.9999999999999999
另外請注意,這樣做print y
或交互式解釋評估y
給出了不同的結果:
In [1]: import numpy as np
In [2]: np.float(1) - 1e-16
Out[2]: 0.9999999999999999
In [3]: print(np.float64(1) - 1e-16)
1.0
不同的是,print
電話str
在評估呼叫repr
:
In [9]: str(np.float64(1) - 1e-16)
Out[9]: '1.0'
In [10]: repr(np.float64(1) - 1e-16)
Out[10]: '0.99999999999999989'
我不明白你的問題。很顯然,錯誤出現在打印表示中,其中'y'小於'float64'情況下的一個,並且由於舍入錯誤而使用'float32'時等於(或大於)'1'。在處理浮點值時,你永遠不會使用相等的比較。修正一個最小誤差(例如'epsilon = 1e-16'或更小/更大取決於應用)並且如果abs(number-1)#number足夠接近於1,則認爲是1。 – Bakuriu
@Bakuriu你可以發佈這個答案......你幾乎可以解釋發生了什麼 –