2013-10-02 153 views
45

我想了解什麼是機器epsilon。根據維基百科,它可以計算如下:蟒蛇numpy機epsilon

def machineEpsilon(func=float): 
    machine_epsilon = func(1) 
    while func(1)+func(machine_epsilon) != func(1): 
     machine_epsilon_last = machine_epsilon 
     machine_epsilon = func(machine_epsilon)/func(2) 
    return machine_epsilon_last 

但是,它只適用於雙精度數字。我有興趣修改它以支持單精度數字。我讀過可以使用numpy,尤其是numpy.float32類。任何人都可以幫助修改該功能嗎?

+5

這個函數是一般足以與所有精度一起工作。只需傳遞'numpy.float32'作爲參數即可! –

回答

93

一個更簡單的方式來獲得一個給定的float類型的機器精度是用np.finfo()

print(np.finfo(float).eps) 
# 2.22044604925e-16 

print(np.finfo(np.float32).eps) 
# 1.19209e-07 
+0

只是100%自信,第一個提供了Python的「標準」精度的固有漂浮,而第二個是numpy的漂浮精度? –

+0

注意到numpy的的標準精度是64(在64位計算機): '>>>打印(np.finfo(np.float).EPS)= 2.22044604925e-16' 和 '>> > print(np.finfo(np.float64).eps)= 2.22044604925e-16' –

+0

@CharlieParker我本可以使用'np.float',因爲它只是Python的內建'float'的別名。幾乎所有平臺上的Python浮點數都是64位(C'double')。因此'float'和'np.float64'通常具有相同的精度,對於大多數用途,您可以互換使用它們。然而它們並不完全相同 - 'np.float64'是一個numpy特定的類型,'np.float64'標量具有與本地'float'標量不同的方法。正如你所期望的那樣,'np.float32'是一個32位浮點數。 –

12

大衛指出,它已經行得通了!

>>> def machineEpsilon(func=float): 
...  machine_epsilon = func(1) 
...  while func(1)+func(machine_epsilon) != func(1): 
...   machine_epsilon_last = machine_epsilon 
...   machine_epsilon = func(machine_epsilon)/func(2) 
...  return machine_epsilon_last 
... 
>>> machineEpsilon(float) 
2.220446049250313e-16 
>>> import numpy 
>>> machineEpsilon(numpy.float64) 
2.2204460492503131e-16 
>>> machineEpsilon(numpy.float32) 
1.1920929e-07 
57

另一種簡單的方式來獲得小量是:

In [1]: 7./3 - 4./3 -1 
Out[1]: 2.220446049250313e-16 
+10

這很有趣 - 你能否詳細說明爲什麼這是有效的? –

+2

是的,爲什麼'8./3 - 5./3 - 1'產生'-eps','4./3 - 1./3 - 1'產生零,而'10./3 - 7' ./3-1'會產生零? –

+14

嗯,答案在這裏,問題3:http://rstudio-pubs-static.s3.amazonaws.com/13303_daf1916bee714161ac78d3318de808a9.html基本上,如果你從7/3中減去4/3的二進制表示,你會得到機器epsilon的定義。所以我認爲這應該適用於任何平臺。 –