2012-10-29 13 views
9

Próbuję obliczyć wykładniczy -1200 w python (to jest przykład, nie potrzebuję -1200 w szczególności, ale zbiór liczb, które są około -1200).Wykładnicza z bardzo małej liczby w pytonie

>>> math.exp(-1200) 
0.0 

Daje mi niedomiar; Jak mogę obejść ten problem?

dzięki za pomoc :)

Odpowiedz

12

w bibliotece standardowej, można spojrzeć na module decimal:

>>> import decimal 
>>> decimal.Decimal(-1200) 
Decimal('-1200') 
>>> decimal.Decimal(-1200).exp() 
Decimal('7.024601888177132554529322758E-522') 

Jeśli potrzebujesz więcej funkcji niż decimal podporach, można spojrzeć na bibliotekę mpmath , którego używam i lubię:

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

, ale jeśli to możliwe, powinieneś zobaczyć, czy możesz przekształcić swoje równania pracować całkowicie w przestrzeni dziennika.

+0

Dzięki, dziesiętnie robię to, co potrzebne :) –

+0

Nie mogłem przekształcić, aby pozostać w obszarze dziennika, ponieważ pracuję z log a i log b i potrzebuję/(a ​​+ b), który wymagałby dziennika (a + b), co nie jest banalne w uzyskiwaniu, gdy ma się tylko log a i log b. –

4

Spróbuj przeprowadzić obliczenia w domenie logarytmicznej tak długo, jak to możliwe. To znaczy. unikaj obliczania dokładnej wartości, ale kontynuuj pracę z wykładnikami.

exp (-1200) Jest bardzo małą liczbą (tak jak exp (1200) jest bardzo dużą liczbą), więc może ta dokładna wartość nie jest tym, czym jesteś zainteresowany. Jeśli potrzebujesz tylko porównać te liczby to przestrzeń logarytmiczna powinna wystarczyć.

+0

Dzięki za twój wkład. Potrzebuję absolutnej precyzji, aby ujednolicić dwie takie wartości; na przykład Potrzebuję e^(log a)/(e^(log a) + e^log (b)), dlaczego mam log a i log b na pierwszym miejscu, ponieważ użyłem sumy logów jako przeciwstawnych do produktu, który był bardzo, bardzo, duży. –

+1

@Pi_: umm, nie jest 'e^(log a)/(e^(log a) + e^log (b))' po prostu 'a/(a ​​+ b)'? – DSM

+0

@astraujums tak, ale nie mam aib. Mam tylko log a i log b, które są tak małe lub mniejsze niż -1200 –

Powiązane problemy