Python numpy日志溢出记录在哪里?

Python numpy日志溢出记录在哪里?,python,numpy,precision,Python,Numpy,Precision,考虑以下数值精度问题: 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的相关文件在哪里?我怎样才能准确地从中预测这些值呢?中记录了数据类型。 NumPy支持floa

考虑以下数值精度问题:

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的相关文件在哪里?我怎样才能准确地从中预测这些值呢?

中记录了数据类型。
NumPy支持float64类型,其范围从1.7976931348623158E+308到2.22507385858585072014E-308。

中记录了数据类型。
NumPy支持float64类型,其范围从1.7976931348623158E+308到2.225073858585072014E-308。

相关完整文档可能不在NumPy中,但遵循IEEE 754标准

这是一个很好的解释

本标准规定了使用非数字操作数无穷大(NaN)的基本数学运算的结果——请参见上面我的链接中的页面末尾——处理器的浮点单元FPU在执行示例中的np.log10或np.round等NumPy函数算法时遵循这些结果

NumPy和Python自己执行的是

将非常大的数字(如1e+309)隐式转换为无穷大, 将非常小的数字(如1e-324)隐式转换为零, 通过自己或“借用”的算法计算其函数的结果。 因此,np.log101e-324计算为np.log100,理论上不存在,但尽管如此,算法还是使用该零值计算,有效地计算极限

在执行此计算过程中,会发生被零除的情况,但该算法捕获ZeroDivisionError异常并引发RuntimeWarning而不是它,因为它认为此零值是“正”零,即,将正或负有限数除以它可能会得到正或负无穷大的结果


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

相关的完整文档可能不在NumPy中,而是遵循IEEE 754标准

这是一个很好的解释

本标准规定了使用非数字操作数无穷大(NaN)的基本数学运算的结果——请参见上面我的链接中的页面末尾——处理器的浮点单元FPU在执行示例中的np.log10或np.round等NumPy函数算法时遵循这些结果

NumPy和Python自己执行的是

将非常大的数字(如1e+309)隐式转换为无穷大, 将非常小的数字(如1e-324)隐式转换为零, 通过自己或“借用”的算法计算其函数的结果。 因此,np.log101e-324计算为np.log100,理论上不存在,但尽管如此,算法还是使用该零值计算,有效地计算极限

在执行此计算过程中,会发生被零除的情况,但该算法捕获ZeroDivisionError异常并引发RuntimeWarning而不是它,因为它认为此零值是“正”零,即,将正或负有限数除以它可能会得到正或负无穷大的结果


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

谢谢你的回答!你知道为什么低于IEEE最小值的np.log101e-323会产生`-323.00518534`几乎正确的答案,而不是-inf吗?因为1e-323在双精度浮点数的范围内,而另一个答案不正确,请遵循我答案中的链接,而1e-324不是。尝试打印1e-323、1e-324。大多数人认为另一个答案中的范围是正确的,甚至sys.float\u info也给出了这样的信息。但在IEEE754中,也被称为非规范化数,它以精度为代价将范围扩展到低于正常值的小数。非规范化的数字在其指数部分由所有0位标记,并且是“非规范化”的,因为在尾数部分的位之前不存在“隐式位1”的假设。谢谢您的回答!你知道为什么低于IEEE最小值的np.log101e-323会产生`-323.00518534`几乎正确的答案,而不是-inf吗?因为1e-323在双精度浮点数的范围内,而另一个答案不正确,请遵循我答案中的链接,而1e-324不是。尝试打印1e-323、1e-324。大多数人认为另一个答案中的范围是正确的,甚至sys.float\u info也给出了这样的信息。但在IEEE754中,也被称为非规范化数,它以精度为代价将范围扩展到低于正常值的小数。非规范化的数字在其指数部分用所有0位来标记,并且是“非规范化”的,因为在此之前不存在“隐式位1”的假设 在它们的尾数部分重新排列。