Skip to main content
 首页 » 编程设计

python之在 NumPy 中使用极小的 float

2025年05月04日21mate10pro

我正在使用 Python 3 并尝试绘制进程的半衰期。该半衰期的公式为 -ln(2)/(ln(1-f))。在这个公式中,f 是一个非常小的数,大部分时间在 10^-17 的数量级,甚至更少。

因为我必须绘制 f 值的范围,所以我必须多次重复计算 -ln(2)/(ln(1-f))。我通过表达式来做到这一点

np.log(2)/(-1*np.log(1-f)) 

当我绘制许多 f 值的半衰期时,我发现对于非常小的 f 值,Python 开始将 1-f 舍入到相同的数字,即使我输入相同的 f 值也是如此。

我是否可以提高浮点精度,以便 Python 可以在 1-f 的输出之间区分 f 的微小变化?

请您参考如下方法:

使用numpy.log1p可以达到你想要的结果.它以比 numpy.log(1 + x) 更好的数值精度计算 log(1 + x),或者如文档所述:

For real-valued input, log1p is accurate also for x so small that 1 + x == 1 in floating-point accuracy.

这样你的代码就变成了:

import numpy as np 
 
min_f, max_f = -32, -15 
f = np.logspace(min_f, max_f, max_f - min_f + 1) 
y = np.log(2)/(-1*np.log1p(-f)) 

这可以被一致地评估:

import matplotlib.pyplot as plt 
plt.loglog(f, y) 
plt.show() 

只有当您的 f 值超出 float 范围时,即下降到 1e-308,此函数才会停止工作。这对于任何物理测量都应该足够了(特别是考虑到存在最小物理时间尺度这样的东西,Planck-time t_P = 5.39116(13)e-44 s)。