76

我是编程新手。在我最新的 Python 2.7 项目中,我遇到了以下问题:

RuntimeWarning:long_scalars 中遇到溢出

有人可以详细说明这意味着什么以及我能做些什么来解决这个问题吗?

代码运行通过,但我不确定忽略警告是否是个好主意。

它发生在附加过程中,例如:

SomeList.append(VeryLongFormula)
4

2 回答 2

75

这是一个发出相同警告的示例:

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

根据 numpy 开发人员 Robert Kern的说法,

与真正的浮点错误(硬件 FPU 在执行溢出的原子操作时设置一个标志)不同,我们需要自己实现整数溢出检测。我们在标量上做,而不是在数组上做,因为对于数组上的每个原子操作实现起来太慢了。

因此,您有责任选择合适的dtypes,以免操作溢出。

于 2011-09-26T19:02:38.840 回答
22

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

list = numpy.array(list, dtype=numpy.float64)
于 2018-02-12T08:25:05.383 回答