python - 在 NumPy 中使用极小的 float

标签 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 的微小变化?

最佳答案

使用numpy.log1p可以达到你想要的结果.它以比 numpy.log(1 + x) 更好的数值精度计算 log(1 + x),或者如文档所述:

For real-valued input, log1p is accurate also for x so small that 1 + 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()

enter image description here

只有当您的 f 值超出 float 范围时,即下降到 1e-308,此函数才会停止工作。这对于任何物理测量都应该足够了(特别是考虑到存在最小物理时间尺度这样的东西,Planck-time t_P = 5.39116(13)e-44 s)。

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

相关文章:

python - py2neo中的节点可以继承吗?

Python - 用空格格式化 file.write 字符串

python - 获取 Numpy 数组的索引

python - 将列表复制到 numpy 数组的一部分

python - django request.POST 包含<无法解析>

python - 将定义集中的值设置为 pandas 数据框中列的给定值(例如 NaN)

python - 忽略 NumPy 中除以 0 的警告

python - 这个切片是什么意思[:, :, 0]?

python - 图像区域的直方图

python - 在 while 循环中使用 xlsxwriter 将多个公式写入 excel 表