我正在使用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的微小变化分散注意力?
答案 0 :(得分:5)
您可以使用numpy.log1p
来实现所需的结果。它计算log(1 + x)
的数值精度高于numpy.log(1 + x)
,或者正如文档所说:
对于实值输入,
log1p
对于x
也是如此之小1 + x == 1
以浮点精度。
这样你的代码就变成了:
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
的值离开浮动范围,即低至1e-308
,此功能将停止工作。这应该足以用于任何物理测量(特别是考虑到存在最小的物理时标,Planck-time t_P = 5.39116(13)e-44 s。