2017-08-24 39 views
2

我正在做一些規範化操作,令我驚訝的是,當試圖恢復操作時,我得到了默認的6位小數精度爲assert_array_almost_equal的100%不匹配。爲什麼會發生?這可能是由於我的最大值的精度?如果是這樣,我如何才能在numpy.ndarray.max()中獲得更高的精度?恢復規範化操作時的精度問題

from __future__ import division 
import numpy 

_max = numpy.float128(67.1036) # output of numpy.ndarray.max() on an a float32 array 

def divide_and_mult(x, y): 
    return numpy.divide(numpy.float128(x), y) * y 

for i in range(100): 
    try: numpy.testing.assert_array_equal(divide_and_mult(i, _max), numpy.float128(i)) 
    except AssertionError, e: print e 
+0

「assert_array_equal」的默認6位小數精度< - 我想你一定會把'assert_array_equal'函數與其他東西混淆。沒有這樣的默認值:'assert_array_equal'檢查_exact_相等,沒有容差。 –

+0

是的,你是對的馬克,我指的是numpy.testing中的'assert_array_almost_equal'函數,我在另一個實驗中使用它來查看不匹配百分比。 –

回答

2

你不能用numpy的陣列獲得更精確的比float128,在大多數系統中最好的還要低:float64

通常情況下,您只是不在乎精度有點損失,並且使用np.testing.assert_almost_equal或類似的函數可以測試特定的絕對和/或相對差異。如果您想以更高的精度做

你需要使用具有無限或至少用戶定義的精度類型:decimal.Decimalfractions.Fraction或切換到一個象徵性的數學庫像sympy