我正在使用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值,即使我输入了相同的f值,Python也会开始将1-f舍入为相同的数字。

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

最佳答案

您可以使用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()


python - 在NumPy中使用极小的浮标-LMLPHP

仅当您的f值超出浮动范围(即降至1e-308)时,此功能才会停止工作。这对于任何物理测量都应该足够了(特别是考虑到存在最小的物理时标,即Planck-time t_P = 5.39116(13)e-44 s)。

关于python - 在NumPy中使用极小的浮标,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49754349/

10-09 13:49