我读过双标量,但部分理解。根据我的理解,这是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