我正在使用 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 forx
so small that1 + 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)。
关于python - 在 NumPy 中使用极小的 float ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49754349/