我正在使用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中的小变化进行研究?
发布于 2018-04-10 13:23:14
您想要的结果可以使用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时,这个函数才会停止工作。这对于任何物理测量都是足够的(特别是考虑到有一个最小的物理时间尺度,普朗克时间 t_P =5.39116(13)e-44s)。
https://stackoverflow.com/questions/49754349
复制相似问题