我是编程新手。在我最新的 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
。
请注意,您不能依靠np.seterr(all='warn')
在 numpy 中捕获所有溢出错误。例如,在 32 位 NumPy
>>> 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
与真正的浮点错误(硬件 FPU 在执行溢出的原子操作时设置一个标志)不同,我们需要自己实现整数溢出检测。我们在标量上做,而不是在数组上做,因为对于数组上的每个原子操作实现起来太慢了。
因此,您有责任选择合适的dtypes
,以免操作溢出。
解决这个问题的一个简单方法是使用64 位类型
list = numpy.array(list, dtype=numpy.float64)