2017-04-14 117 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 
相关问题