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+3082.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 而不是它,因为它认为此零值是“正”零,即用它除(正或负)有限数 是可能的(给出正或负无穷大的结果)。

那么结果就是负无穷大,当然是越来越小的正值(“无限小”小的)的对数极限。