【问题标题】:How can i avoid getting result 0 from exp() for very small float numbers?对于非常小的浮点数,如何避免从 exp() 获得结果 0?
【发布时间】:2020-03-26 10:24:24
【问题描述】:

我正在尝试从以非常小的浮点作为输入并给我结果 0 的指数中获取精确值。

您可以使用以下代码重现问题:

import numpy as np
from math import sqrt, log, exp, pi

k = np.array([[-746.9292399]])
z = exp(k)
print(z)

这个结果将是 0 ,对于我的电脑来说,任何小于 -743.0 的结果都是 0

我已经尝试使用 mpmath 来解决这个问题,如下所示:

import numpy as np
from math import sqrt, log, exp, pi
import mpmath as mp

k = np.array([[-746.9292399]])
z = mp.exp(float(k))
print(z)

det = np.linalg.det([[z,2,3],[2,2,z],[3,6,2]])
print(det)

这为 exp() 提供了一个很好的答案,但是我还需要将该结果放入一个 numpy 数组中,并从中提取行列式,这会在我附加的代码中引发错误,因为 numpy 没有就像数组中的 mpf 数字一样。

任何人都知道我如何从 exp() 中获取结果,以便我可以将它与 numpy 及其函数一起使用?

【问题讨论】:

  • 作为参考,在数学上,exp(-746.9292399) 是 4.0997...e-325。 binary64 的最小值是 4.940656...E-324

标签: python arrays numpy floating-point exp


【解决方案1】:

这是explog 函数的常见问题,因为输出往往会很快消失为零。一个很好的观察是,在大多数科学计算中通常需要expr(x) - 1,并且大多数实现都为此提供了自定义函数以避免数值稳定性问题。因此,如果它适合您的用例,您绝对应该考虑expm1。类似的考虑也适用于log,因此我们有log1pexpm1log1pexplog1mexp 等。有关详细信息,请参见此处:https://docs.scipy.org/doc/numpy-1.13.0/reference/generated/numpy.expm1.html

【讨论】:

  • 我正在尝试为期望最大化算法实现概率密度函数,我已经尝试过你的方法,但是之前的最终估计更准确(目前我只是在做一个简单的 if(x
【解决方案2】:

在我看来,exp(-745) 附近的值是浮点数可以容纳的最小值。

注意

>>> exp(-744)
1e-323

浮点几乎完全向右移动。 我相信这就是python的float的极限了。

【讨论】:

  • 是的,我想知道是否有办法克服这个限制。
  • 我明白了。我不是专家或任何东西,所以在这种情况下我可能没有用,但我希望你能克服这个问题。
【解决方案3】:

好的,我已经为此工作了大约 30 分钟,我得到了这个

import decimal
pow(decimal.Decimal(math.exp(1)),decimal.Decimal(-748.9292399))

另外,请查看Exponential of large negative numbers

有一个小问题。我用 Windows 计算器计算了你的问题,它给了我这个 3.819636355e-325

【讨论】:

    猜你喜欢
    • 2012-05-18
    • 1970-01-01
    • 1970-01-01
    • 2015-10-02
    • 1970-01-01
    • 2021-02-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多