2017-04-14 43 views
1

我讀過雙標量,但部分理解。根據我的理解,這是Numpy可以計算的範圍。這就是爲什麼大多數問題關注於零除(這是一個錯誤,因爲答案將超出範圍(無窮大))。除了除零之外,double_scalar中遇到溢出的原因是什麼?

但我很不確定我的理解是正確的。此外,我看不到有關在double_scalars遇到RuntimeWarning:overflow其他原因。什麼會導致雙標量遇到溢出?

回答

1

RuntimeWarning的另一個非常流行的原因:溢出遇到的是浮點錯誤。欲瞭解更多信息,你可以看看here

此外,這裏有一些浮點異常的定義。

的浮點異常在IEEE 754標準中定義1

被零除:從有限數獲得無限結果。 溢出:結果太大而無法表達。 下溢:結果如此接近零,以致某些精度丟失。 操作無效:結果不是可表示的數字,通常表示NaN已生成。

我希望這有助於好運。

2

NumPy遵守IEEE浮點限制。在浮點精度最小到最大的表示的數字可以用numpy.finfo

In [35]: np.finfo(dtype=np.float64) 
Out[35]: finfo(resolution=1e-15, min=-1.7976931348623157e+308, max=1.7976931348623157e+308, dtype=float64) 

In [36]: np.finfo(dtype=np.float32) 
Out[36]: finfo(resolution=1e-06, min=-3.4028235e+38, max=3.4028235e+38, dtype=float32) 

因此,對於雙精度進行查詢,任何numpy的功能(如divide, exp, sqrt, ...)溢出範圍~[-1.797e+308, 1.797e+308]將引發溢出警告。

例如:

In [37]: np.ones(1)/1e-308 # fine 
Out[37]: array([ 1.00000000e+308]) 
In [38]: np.ones(1)/1e-309 # overflow 
/usr/bin/ipython:1: RuntimeWarning: overflow encountered in divide 
Out[38]: array([ inf]) 
In [39]: np.exp(1000.) # overflow 
/usr/bin/ipython:1: RuntimeWarning: overflow encountered in exp 
Out[39]: inf 
2

溢出錯誤意味着一個操作產生一個值出於對相應的數據類型定義的範圍。對於numpy double,該範圍是(-1.79769313486e+308, 1.79769313486e+308)。另外,如需詳細討論,請撥打read this SO post

實施例:

import numpy as np 
np.seterr(all='warn') 
print "Range of numpy double:", np.finfo(np.double).min, np.finfo(np.double).max 
A = np.array([143],dtype='double') 
a=A[-1] 
print "At the border:", a**a 
B = np.array([144],dtype='double') 
b=B[-1] 
print "Blowing out of range:", b**b 

輸出:

Range of numpy double: -1.79769313486e+308 1.79769313486e+308 
At the border: 1.6332525973e+308 
Blowing out of range: inf 
D:\anaconda\lib\site-packages\ipykernel\__main__.py:9: RuntimeWarning: overflow encountered in double_scalars 
相關問題