Python RuntimePolice: 长标量中遇到的溢出

我是编程新手,在我最近的 Python 2.7项目中,我遇到了以下情况:

RuntimePolice: long _ scalars 中遇到溢出

有人能解释一下这意味着什么以及我能做些什么来解决这个问题吗?

代码运行了一遍,但是我不确定忽略这个警告是否是一个好主意。

它发生在追加过程中,比如:

SomeList.append(VeryLongFormula)
256402 次浏览

下面是一个发出同样警告的例子:

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,而 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

根据愚蠢的开发者 Robert Kern 的说法,

与真正的浮点错误不同(其中硬件 FPU 设置 旗帜 无论何时进行溢出的原子操作) ,我们都需要 我们自己实现了整数溢出检测 的 而不是数组,因为它实现起来太慢了 为了 数组上的每个原子操作。

因此,选择适当的 dtypes以避免操作溢出是您的责任。

克服这个问题的一个简单方法是使用 64位类型

my_list = numpy.array(my_list, dtype=numpy.float64)