2017-02-16 42 views
0

math.ldexp(0.5, 1025)結果在OverflowError。 Numpy的等效函數返回inf。在另一端,但是,math.ldexp(0.5, -1074)沒有引發異常,而是返回0.0,如下圖所示:爲什麼`math.ldexp`會引發OverflowError指數大於1024,但不會指數<-1073?

In [275]: math.ldexp(0.5, 1024) 
Out[275]: 8.98846567431158e+307 

In [276]: math.ldexp(0.5, 1025) 
--------------------------------------------------------------------------- 
OverflowError        Traceback (most recent call last) 
<ipython-input-276-ce1573e0249b> in <module>() 
----> 1 math.ldexp(0.5, 1025) 

OverflowError: math range error 

In [277]: math.ldexp(0.5, -1073) 
Out[277]: 5e-324 

In [278]: math.ldexp(0.5, -1074) 
Out[278]: 0.0 

爲什麼Python的raiso的OverflowError當指數太大,而不是在它太小?有沒有正當的理由,還是應該被視爲一個錯誤?

+2

浮點是不精確的表示。 '0.0'是'math.ldexp(0.5,-1074)'最接近的不精確表示。 'math.ldexp(0.5,1025)'沒有相應的浮點表示。 –

+1

指數太小*是*下溢,而不是*溢出*。 –

+0

@StevenRumbalski浮點數和'math.ldexp(a,b)'是任何可以寫成'a * 2 ** b'的數字的精確表示。 – gerrit

回答

3

已知IEEE浮點運算具有某種程度的不精確性。 0.0是一個非常接近math.ldexp(0.5, -1074)的值。但是,表達值接近math.ldexp(0.5, 1025)的值沒有有效的方式,所以我會假設這就是爲什麼會引發異常。

相關問題