在NumPy中使用极小的浮动

时间:2018-04-10 12:58:02

标签: python numpy

我正在使用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的微小变化分散注意力?

1 个答案:

答案 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()

enter image description here

如果f的值离开浮动范围,即低至1e-308,此功能将停止工作。这应该足以用于任何物理测量(特别是考虑到存在最小的物理时标,Planck-time t_P = 5.39116(13)e-44 s。