我是编程新手。在我最新的Python 2.7项目中,我遇到了以下问题:
RuntimeWarning:long_scalars中遇到溢出
有人可以详细说明这意味着什么,我可以做些什么来解决?
代码会一直运行,但是我不确定忽略警告是否是个好主意。
它发生在附加过程中,例如:
SomeList.append(VeryLongFormula)
这是发出相同警告的示例:
import numpy as np np.seterr(all='warn') A = np.array([10]) a=A[-1] a**a
产量
RuntimeWarning: overflow encountered in long_scalars
在上面的示例中,它的发生是因为的类型a是dtype int32,并且在an中可存储的最大值int32是2 ** 31-1。由于10**10 > 2**32-1,求幂导致的数字大于可以存储在int32。
a
int32
10**10 > 2**32-1
请注意,您不能依赖于np.seterr(all='warn')在numpy中捕获所有溢出错误。例如,在32位NumPy上
np.seterr(all='warn')
>>> np.multiply.reduce(np.arange(21)+1) -1195114496
在64位NumPy上:
>>> np.multiply.reduce(np.arange(21)+1) -4249290049419214848
两者都失败,没有任何警告,尽管这也是由于溢出错误引起的。正确的答案是21!等于
In [47]: import math In [48]: math.factorial(21) Out[50]: 51090942171709440000L
根据Numpy开发人员Robert Kern所说,
与真正的浮点错误(硬件FPU在执行溢出的原子操作时会设置标志)不同,我们需要自己实现整数溢出检测。我们在标量上执行此操作,但不在数组上执行,因为对于数组上的每个原子操作而言,实现它都太慢了。
因此,选择合适的负担是您的重担,dtypes这样就不会出现任何操作溢出的情况。
dtypes