迹忆客 专注技术分享

当前位置:主页 > 学无止境 > 编程语言 > Python >

解决 Python中错误 Overflow Encountered in Double_Scalars

作者:迹忆客 最近更新:2023/06/29 浏览次数:

Python 库包 Numpy 下定义的 Double 标量是数据类型 double 的值。 该数据类型用于计算大量数字。

通常,这些数字的大小变得如此之大,以至于程序进入溢出状态并显示警告 overflow encountered in double_scalars。 本文将解释双标量中的溢出、导致此问题的某种情况以及如何解决它。


Python中错误 overflow encountered in double_scalars 的原因

双标量具有较高和较低的范围。 较小数字的算术计算通常会产生结果,但是当这些数字的幂超过某个阈值时,就会出现 double_scalars 遇到的溢出问题。

让我们看一个例子来理解它。

该程序显示双标量的范围,在范围的边界显示计算结果,然后显示发生溢出错误的点; 它显示 double_scalars 中遇到的警告溢出。

该程序导入Python包numpy并将错误处理设置为 all='warn',这会在运行时发出错误警告。

import numpy as np

np.seterr(all='warn')

为了查找 numpy 数据类型的范围,我们将使用数据类型例程 finfo。 该例程在调用时返回浮点类型的限制,例如系统内的双标量。

查找双标量的下限(即最小值)将需要类似 np.finfo(np.double).min 的语法。 在此程序中,使用 min 和 max 子例程找到最小值和最大值。

print("Range of numpy double:", np.finfo(np.double).min, np.finfo(np.double).max)

为了查找范围边界处的值,创建了数据类型为 double 的 numpy 数组 A。 该数组有一个值为 143 的元素。

第 0 个索引值被复制到变量 a 中,以从此数组中提高该值的自身幂。 然后使用 a**a 将该变量求成其自身的幂。

A = np.array([143], dtype='double')
a = A[0]
print("At the border:", a ** a)

程序运行正确,直到上面的代码,但是当在给定的 double 标量范围之外执行操作时,会发生 double_scalars 中的溢出。

创建一个新数组 B,它存储的值比前一个数组中使用的值更大,以重现此警告。

当该值取其自身幂时,程序会显示警告 overflow encountered in double_scalars

import numpy as np

np.seterr(all='warn')
print("Range of numpy double:", np.finfo(np.double).min, np.finfo(np.double).max)
A = np.array([143], dtype='double')
a = A[0]
print("At the border:", a ** a)
B = np.array([144], dtype='double')
b = B[-1]
print("Blowing out of range:", b ** b)

输出:

C:/Users/Win 10/PycharmProjects/overflow_longscalars/2.py:11: RuntimeWarning: overflow encountered in double_scalars
  print("Blowing out of range:", b ** b)
Range of numpy double: -1.7976931348623157e+308 1.7976931348623157e+308
At the border: 1.6332525972973913e+308
Blowing out of range: inf

避免 overflow encountered in double_scalars 错误的方法

如上例所示,跨越数据类型的最高范围可能会导致 overflow encountered in double_scalars。 避免这种错误的最好方法是在给定范围内工作或提高计算能力。

但在某些情况下,数据类型会造成瓶颈。 这是一个传达相同警告的程序。

当值 143 求其自身幂时,第一个数据类型 float32 的数组会溢出。 发生这种情况是因为 float 最多可以携带 8 位指数。

另一方面,数据类型 double 可以承受最多 11 位指数位的计算,这就是它不会溢出并产生结果的原因。

import numpy as np

np.seterr(all='warn')

A = np.array([143], dtype=np.float32)
a = A[-1]
print("Array with datatype float:", a ** a)
B = np.array([143], dtype=np.double)
b = B[-1]
print("Array with datatype double", b ** b)

输出:

当程序尝试执行 a**a 并在输出中显示 inf 时,程序会遇到类似于双标量的溢出,这意味着结果是无限的。

不过,当使用不同的数据类型时,我们会得到期望的结果。

Array with datatype float: inf
Array with datatype double 1.6332525972973913e+308
C:/Users/Win 10/PycharmProjects/overflow_longscalars/5.py:7: RuntimeWarning: overflow encountered in float_scalars
  print("Array with datatype float:", a ** a)

有些计算用无穷大来表示超出范围的结果,这意味着结果巨大。

float64 等数据类型的数字范围为 -1.79769313486e+3081.79769313486e+308。 据观察,变大或变小会导致溢出。

例如,如果最大范围 - np.double(1.79769313486e+308) 乘以 1.1,则会收到运行时警告 overflow encountered in double_scalars

必须记住,这只是一个警告,它会继续运行。

但是,由于数字太大,因此无法返回 1。 相反,它提供了 inf。

尽管一些有效的计算使用无穷大,但有些计算会产生 nan,它代表没有数字,如下面的程序所示。

import numpy as np

var1 = np.inf - 10 ** 6
var2 = np.inf + 10 ** 6
var3 = np.inf / 10 ** 6
var4 = np.inf * 10 ** 6
var5 = np.inf * (-10 ** 6)
var6 = 1 / np.inf
var7 = np.inf * np.inf
var8 = np.inf/np.inf
var9 = np.inf-np.inf

print(var1, var2, var3, var4, var5, var6, var7, var8, var9)

输出:

inf inf inf inf -inf 0.0 inf nan nan

上面的程序显示了所有可能遇到无穷大和 nan 的情况。

有时,程序不会进入溢出状态或显示无穷大或 NaN,但产生的结果不仅不准确,而且明显不正确。

在下面的示例中,数组 A 被声明为 int64 数据类型。 该数据类型根据所使用的机器存储不同的位。

当存储在该变量内的值求其自身的幂时,程序输出无关紧要的值,而不是发生溢出或显示无穷大。

例如,像 50 这样的正整数,当计算其自身的幂时,应该产生一个正整数,但是当执行下面的代码时,结果是一个负值。

import numpy as np

np.seterr(all='warn')
A = np.array([50], dtype=np.int64)
a = A[-1]
print(a ** a)

输出:

-6646187150092009472

但是,当相同的值存储在 double 或 longdouble 等数据类型中时,我们会得到适当的结果。

import numpy as np

np.seterr(all='warn')
A = np.array([50], dtype=np.longdouble)
a = A[-1]
print(a ** a)

输出:

8.881784197001252e+84

尽管超出该范围不会中断程序并产生错误,但忽略 overflow encountered in double_scalars 警告可能会导致呈现不稳定的结果。


Python 中出现的其他一些溢出警告

本节将教我们捕获双标量以外的溢出错误。 主要还有另外两种经常出现的溢出。

  1. overflow encountered in power

    当 numpy 子例程 power 用于计算一个数的自身次方时,如果结果超出范围,则会抛出 overflow encountered in power

    import numpy as np
    np.seterr(all='warn')
    print(np.power(143, 144, dtype=np.double))
    
    输出:
    inf
    C:/Users/main.py:12: RuntimeWarning: overflow encountered in power
    print(np.power(143, 144, dtype=np.double))
    
  2. Overflow encountered in exp

    在指数运算期间会遇到这种溢出。 将一个数字提高到大指数次方会得到 inf,而除以该数字会得到零。

    import numpy as np
    print(1*(1+np.exp(1140)))
    print(1/(1+np.exp(1140)))
    
    输出:
    inf
    0.0
    C:/Users/main.py:7: RuntimeWarning: overflow encountered in exp
    print(1*(1+np.exp(1140)))
    C:/Users/main.py:8: RuntimeWarning: overflow encountered in exp
    print(1/(1+np.exp(1140)))
    

总结

本文解释了如何规避运行时警告,例如 overflow encountered in double_scalars 等。读完本文后,读者可以轻松捕获溢出错误。

转载请发邮件至 1244347461@qq.com 进行申请,经作者同意之后,转载请以链接形式注明出处

本文地址:

相关文章

解决 C++ 中错误 Python.h: No Such File or Directory

发布时间:2023/06/29 浏览次数:95 分类:Python

本文将解释如何解决错误 'Python.h': No such file or directory。 当我们尝试在 C++ 中嵌入 Python 代码,但编译器无法在系统内部找到对 Python 的引用时,通常会发生这种情况。C++ 中 'Python.h': No such file

使用 Pickle 在 Python 中保存和加载对象

发布时间:2023/06/29 浏览次数:67 分类:Python

本文演示了如何在 Python 中保存和重新加载对象。 我们还将了解如何使用 Python 进行 Pickling 和 Unpickling。 此外,我们将看到 Pickling 的优点和缺点。

Python中defaultdict的使用

发布时间:2023/06/29 浏览次数:126 分类:Python

今天的文章讨论 defaultdict 容器并使用代码示例演示其用法。Python 中的 defaultdict 与 dict defaultdict 是一个类似字典的容器,属于 collections 模块。

Python 中的 with 语句

发布时间:2023/06/29 浏览次数:83 分类:Python

本篇文章将介绍with语句的功能及其在Python中的应用。在Python中使用with语句 该语句本质上用于帮助处理异常并在使用资源时清理资源。 它确保代码正确执行并随后清理资源。

Python 单步执行代码

发布时间:2023/06/29 浏览次数:145 分类:Python

在本文中,我们将讨论使用 Python 调试器单步调试代码。 我们将从头开始解释一个名为 PDB 的命令行工具。 我们还将学习如何在 Python IDLE 的帮助下逐步执行代码。

Python 编辑距离

发布时间:2023/06/29 浏览次数:67 分类:Python

今天,我们将学习Python中的编辑距离。 我们还将探讨字符串的插入、删除、替换和递归实现。在 Python 中编辑距离 编辑距离是将一个字符串转置为另一个字符串所需的量。

在 Python 中解析 JSON 对象数组

发布时间:2023/06/28 浏览次数:57 分类:Python

由于浏览器可以快速解析 JSON 对象,因此它们有助于在客户端和服务器之间传输数据。 本文将介绍如何使用Python的JSON模块传输和接收JSON数据。

在 Python 中等待 5 秒

发布时间:2023/06/28 浏览次数:152 分类:Python

本篇文章将讨论如何在 Python 中等待 5 秒。在 Python 中使用 time.sleep() 函数等待 5 秒 Python 的 time 模块提供了存储和操作时间的功能和对象。

扫一扫阅读全部技术教程

社交账号
  • https://www.github.com/onmpw
  • qq:1244347461

最新推荐

教程更新

热门标签

扫码一下
查看教程更方便