numpy 日志溢出记录在哪里?
Where is numpy log overflow documented?
考虑这些数值精度问题:
import numpy as np
np.log10(1e-324) # -inf & divide-by-zero
np.log10(1e+309) # +inf
np.round(x, +308) # inf
np.round(x, +309) # nan
np.round(x, -308) # nan
这些数字非常大,足以导致我的计算机溢出 (?)。
numpy 中的相关文档在哪里?我如何从中准确预测这些值?
数据类型记录在 Data types 中。
NumPy 支持 float64
类型,范围从 1.7976931348623158E+308
到 2.2250738585072014E-308
。
相关的完整文档可能不在 NumPy 本身中,而是遵循 IEEE 754 标准。
在 GeeksforGeeks - IEEE Standard 754 Floating Point Numbers.
中有一个很好的解释
该标准也规定了使用 非数字操作数(无穷大、NAN)的基本数学运算的结果 — 请参阅上面我的 link 页末— 处理器的浮点单元 (FPU) 在为 NumPy 函数执行算法时遵循它们(如示例中的 np.log10()
或 np.round()
)。
NumPy(和 Python)执行本身是
- 非常大的数字(如您的
1e+309
)到 无穷大、 的隐式转换
- 非常小的数字(如您的
1e-324
)到零, 的隐式转换
- 通过他们自己的(或“借来的”)算法计算他们的函数的结果。
所以np.log10(1e-324)
被计算为np.log10(0)
,这在理论上是不存在的,但尽管如此,算法还是使用这个零值来计算它(有效地计算极限)。
在执行此计算期间发生被零除但算法捕获 ZeroDivisionError
异常并引发 RuntimeWarning
而不是它,因为它认为此零值是“正”零,即用它除(正或负)有限数 是可能的(给出正或负无穷大的结果)。
那么结果就是负无穷大,当然是越来越小的正值(“无限小”小的)的对数极限。
考虑这些数值精度问题:
import numpy as np
np.log10(1e-324) # -inf & divide-by-zero
np.log10(1e+309) # +inf
np.round(x, +308) # inf
np.round(x, +309) # nan
np.round(x, -308) # nan
这些数字非常大,足以导致我的计算机溢出 (?)。
numpy 中的相关文档在哪里?我如何从中准确预测这些值?
数据类型记录在 Data types 中。
NumPy 支持 float64
类型,范围从 1.7976931348623158E+308
到 2.2250738585072014E-308
。
相关的完整文档可能不在 NumPy 本身中,而是遵循 IEEE 754 标准。
在 GeeksforGeeks - IEEE Standard 754 Floating Point Numbers.
中有一个很好的解释该标准也规定了使用 非数字操作数(无穷大、NAN)的基本数学运算的结果 — 请参阅上面我的 link 页末— 处理器的浮点单元 (FPU) 在为 NumPy 函数执行算法时遵循它们(如示例中的 np.log10()
或 np.round()
)。
NumPy(和 Python)执行本身是
- 非常大的数字(如您的
1e+309
)到 无穷大、 的隐式转换
- 非常小的数字(如您的
1e-324
)到零, 的隐式转换
- 通过他们自己的(或“借来的”)算法计算他们的函数的结果。
所以np.log10(1e-324)
被计算为np.log10(0)
,这在理论上是不存在的,但尽管如此,算法还是使用这个零值来计算它(有效地计算极限)。
在执行此计算期间发生被零除但算法捕获 ZeroDivisionError
异常并引发 RuntimeWarning
而不是它,因为它认为此零值是“正”零,即用它除(正或负)有限数 是可能的(给出正或负无穷大的结果)。
那么结果就是负无穷大,当然是越来越小的正值(“无限小”小的)的对数极限。