Python RuntimeWarning:长标量中遇到溢出

Posted

技术标签:

【中文标题】Python RuntimeWarning:长标量中遇到溢出【英文标题】:Python RuntimeWarning: overflow encountered in long scalars 【发布时间】:2011-11-25 10:52:22 【问题描述】:

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

RuntimeWarning:long_scalars 中遇到溢出

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

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

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

SomeList.append(VeryLongFormula)

【问题讨论】:

能否请您出示一个证明此问题的short, complete example? 你包含了 numpy 标签。您的问题中没有任何内容表明 numpy。您没有包含允许我们重现错误的代码。请这样做。 ***.com/questions/3767409/…的可能重复 【参考方案1】:

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

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

【讨论】:

【参考方案2】:

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

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

According to numpy developer, Robert Kern,

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

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

【讨论】:

谢谢!如何定义我想要的 dtype? 创建numpy数组时可以设置dtype。例如,在我上面的例子中,你可以通过设置来避免溢出错误:A = np.array([10],dtype='int64') 这是list of basic dtypes。 非常感谢!!!我将变量 AF 和 RT 转换为 float64:AF = np.float64(AF),警告消失了。 @Zelphir:感谢您指出这一点。你是对的——在 32 位操作系统上,np.multiply.reduce(np.arange(17)+1) 返回 -288522240 (ideone demo),但在 64 位操作系统上,它返回正确答案 355687428096000。我将上面帖子中的示例更改为np.multiply.reduce(np.arange(21)+1),它在 32 位和 64 位操作系统上都会溢出。

以上是关于Python RuntimeWarning:长标量中遇到溢出的主要内容,如果未能解决你的问题,请参考以下文章

python3 Django 报错RuntimeWarning的解决办法

使用 python 线程时出现协程错误,RuntimeWarning: coroutine 'time_messege' 从未等待

如何阻止 python RuntimeWarning 打印到终端? [复制]

RuntimeWarning , RuntimeError (Discord 服务器上的 Python Al Chat Bot)

遇到问题--python---RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility.(

遇到问题--python---RuntimeWarning: greenlet.greenlet size changed, may indicate binary incompatibility.(