2012-10-29 4 views
9

Я пытаюсь вычислить экспоненту -1200 в python (это пример, мне не нужно, в частности, -1200, но набор чисел, который составляет -1200).Экспоненциально очень малое число в python

>>> math.exp(-1200) 
0.0 

Это дает мне недостаток; Как я могу обойти эту проблему?

Спасибо за любую помощь :)

ответ

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') 

, но, если возможно, вы должны увидеть, полностью работать в лог-пространстве.

+0

Спасибо, десятичный делает то, что мне нужно :) –

+0

Я не мог переделать, чтобы оставаться в лог-пространстве, поскольку я работаю с журналом a и log b и нуждаюсь в/(a ​​+ b), который потребует журнала (a + b), что не является тривиальным в получении при наличии только log a и log b. –

4

Пробуйте рассчитывать в логарифмическом домене как можно дольше. То есть избегайте вычисления точного значения, но продолжайте работать с показателями.

exp (-1200) IS очень очень маленькое число (так же, как exp (1200) очень очень большой), поэтому, возможно, точное значение не совсем то, что вас интересует. Если вам нужно сравнить этих чисел тогда логарифмическое пространство должно быть достаточно.

+0

Спасибо за ваш вклад. Мне нужна абсолютная точность для стандартизации двух таких значений; например Мне нужно e^(log a)/(e^(log a) + e^log (b)), о том, почему у меня есть log a и log b, в первую очередь это потому, что я использовал сумму журналов, в отличие от к продукту, который был очень, очень, большой. –

+1

@Pi_: umm, не 'e^(log a)/(e^(log a) + e^log (b))' просто 'a/(a ​​+ b)'? – DSM

+0

@astraujums да, но у меня нет a и b. У меня только log a и log b, которые оказались такими же маленькими или меньшими, как -1200 –