Python中非常小的数的指数

9

我正在尝试在Python中计算e的-1200次方(这只是一个例子,我不需要特定的-1200,而是一组接近-1200的数字)。

>>> math.exp(-1200)
0.0

我的程序出现了下溢,该怎么解决这个问题?

谢谢任何帮助 :)

2个回答

12
在标准库中,您可以查看decimal模块:
>>> import decimal
>>> decimal.Decimal(-1200)
Decimal('-1200')
>>> decimal.Decimal(-1200).exp()
Decimal('7.024601888177132554529322758E-522')

如果您需要比 decimal 库提供的更多功能,您可以查看我经常使用和喜欢的 mpmath 库:

>>> import mpmath
>>> mpmath.exp(-1200)
mpf('7.0246018881771323e-522')
>>> mpmath.mp.dps = 200
>>> mpmath.exp(-1200)
mpf('7.0246018881771325545293227583680003334372949620241053728126200964731446389957280922886658181655138626308272350874157946618434229308939128146439669946631241632494494046687627223476088395986988628688095132e-522')

但是如果可能的话,您应该尝试看看是否可以将方程完全转换为对数空间。


谢谢,十进制做到了我所需要的 :) - Pi_
我无法重新调整以保持在对数空间中,因为我正在使用log a和log b,并且需要a /(a + b),这将需要log(a + b),而仅有log a和log b时获得它并不容易。 - Pi_

4
尽可能在对数域中进行计算。即避免计算精确值,而要继续使用指数形式。
exp(-1200)是一个非常非常小的数字(就像exp(1200)是非常非常大的数字一样),因此也许您并不真正关心精确值。如果您只需要比较这些数字,则对数空间就足够了。

感谢您的输入。我需要绝对精度来标准化两个这样的值;例如,我需要e^(log a)/(e^(log a) + e^log(b))。为什么我一开始使用log a和log b,是因为我使用了对数之和而不是乘积,这样会非常非常大。 - Pi_
1
@Pi_: 嗯,e^(log a)/(e^(log a) + e^log(b)) 不就是简单地等于 a/(a+b) 吗? - DSM
@astraujums 是的,但我没有a和b。我只有log a和log b,它们恰好小于或等于-1200。 - Pi_
2
@Pi_ e^(log a)/(e^(log a) + e^log(b))=1/(1+e^(log(b)-log(a))) - Teepeemm

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接