Python 对于非常小的浮点数,如何避免从exp()得到结果0?

Python 对于非常小的浮点数,如何避免从exp()得到结果0?,python,arrays,numpy,floating-point,exp,Python,Arrays,Numpy,Floating Point,Exp,我试图从一个指数中得到精确的值,它得到一个非常小的浮点作为输入,结果是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 imp

我试图从一个指数中得到精确的值,它得到一个非常小的浮点作为输入,结果是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(-745)的值是浮点所能容纳的最小值

注意

>>> exp(-744)
1e-323
浮点几乎完全向右移动。
我相信这是python浮点运算的极限。

好的,我已经做了大约30分钟了,我得到了这个

import decimal
pow(decimal.Decimal(math.exp(1)),decimal.Decimal(-748.9292399))
还有,检查一下这个


有一个小问题。我用windows calculator计算了您的问题,它给了我这个3.819636355e-325

这是
exp
log
函数的一个常见问题,因为输出很快就会消失为零。一个很好的观察结果是,在大多数科学计算中,您通常需要
expr(x)-1
,并且大多数实现都为此提供了自定义函数,以避免数值稳定性问题。所以,如果它适合你的用例,你应该明确地考虑<代码> ExpM1。类似的考虑也适用于
log
,因此我们有
log1p
expm1
log1exp
log1mexp
等。详情请参见此处:

是的,我想知道是否有办法克服此限制。我明白了。我不是专家或其他任何人,所以我可能在这种情况下没有用处,但我希望你能克服这个问题。我试图实现一个期望最大化算法的概率密度函数,我尝试过你的方法,但是最终的估计以前更准确(目前我只是做一个简单的if(x<-743):x=-743,尝试使程序不抛出错误)@别名作为参考,数学上,
exp(-746.9292399)
‭4.0997…e-325‬. 的最小值为4.940656…E-324