Python 运行时警告:长整型标量溢出。

90

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

RuntimeWarning:long_scalars中遇到溢出

请问有人可以详细说明这意味着什么以及我该如何修复它吗?

代码可以正常运行,但我不确定是否明智地忽略此警告。

它发生在类似以下的附加过程中:

SomeList.append(VeryLongFormula)

5
请提供一个简短而完整的示例,以演示此问题。 - Greg Hewgill
4
你添加了numpy标签,但是你的问题中并没有涉及到numpy。你也没有提供能够重现错误的代码,请提供相关代码。 - David Heffernan
1
可能是重复的问题,与https://dev59.com/aG865IYBdhLWcg3wivGi相似。 - rocksportrocker
2个回答

88

以下是一个发出同样警告的示例:

import numpy as np
np.seterr(all='warn')
A = np.array([10])
a=A[-1]
a**a
产生。
RuntimeWarning: overflow encountered in long_scalars
在上面的示例中,发生这种情况是因为a的数据类型是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

据numpy开发人员Robert Kern表示,与真正的浮点错误不同(其中硬件FPU在执行溢出原子操作时设置标志),我们需要自己实现整数溢出检测。 我们对标量进行检查,但不对数组进行检查,因为在每个数组的原子操作上实现这一点将会太慢。

因此,您需要选择适当的dtypes,以便没有任何操作会溢出。


3
谢谢!我该如何定义所需的数据类型(dtype)? - timkado
13
创建numpy数组时,您可以设置dtype。例如,在上面的示例中,您可以通过设置A = np.array([10], dtype='int64')来避免溢出错误。 - unutbu
4
这是一份基本数据类型列表 - unutbu
3
非常感谢!我将变量 AF 和 RT 转换为 float64:AF = np.float64(AF),这样就消除了警告。 - timkado
1
np.multiply.reduce(np.arange(17)+1) 对我来说不是 -288522240,而是你提到的大整数。这是机器相关的吗? - Zelphir Kaltstahl
2
@Zelphir:感谢您指出这一点。您是正确的——在32位操作系统上,np.multiply.reduce(np.arange(17)+1)返回-288522240ideone演示),但在64位操作系统上,它返回正确的答案355687428096000。我已经将上面的示例更改为np.multiply.reduce(np.arange(21)+1),它在32位和64位操作系统上都会溢出。 - unutbu

24

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

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接