解决 Python中错误 Overflow Encountered in Double_Scalars
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+308 到 1.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 中出现的其他一些溢出警告
本节将教我们捕获双标量以外的溢出错误。 主要还有另外两种经常出现的溢出。
-
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))
-
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 等。读完本文后,读者可以轻松捕获溢出错误。
相关文章
解决 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 中编辑距离 编辑距离是将一个字符串转置为另一个字符串所需的量。
type.Dict 和 Dict 之间的区别及其在 Python 中的用途
发布时间:2023/06/28 浏览次数:93 分类:Python
-
本文讨论如何将类型提示与 Typing.Dict 结合使用,并将其与通常的 dict 函数区分开来。type.Dict 和 dict 之间的区别及其在 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 模块提供了存储和操作时间的功能和对象。