我讀過雙標量,但部分理解。根據我的理解,這是Numpy可以計算的範圍。這就是爲什麼大多數問題關注於零除(這是一個錯誤,因爲答案將超出範圍(無窮大))。除了除零之外,double_scalar中遇到溢出的原因是什麼?
但我很不確定我的理解是正確的。此外,我看不到有關在double_scalars遇到RuntimeWarning:overflow
其他原因。什麼會導致雙標量遇到溢出?
我讀過雙標量,但部分理解。根據我的理解,這是Numpy可以計算的範圍。這就是爲什麼大多數問題關注於零除(這是一個錯誤,因爲答案將超出範圍(無窮大))。除了除零之外,double_scalar中遇到溢出的原因是什麼?
但我很不確定我的理解是正確的。此外,我看不到有關在double_scalars遇到RuntimeWarning:overflow
其他原因。什麼會導致雙標量遇到溢出?
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
溢出錯誤意味着一個操作產生一個值出於對相應的數據類型定義的範圍。對於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