2012-10-29 13 views
9

Sto provando a calcolare l'esponenziale di -1200 in python (è un esempio, non ho bisogno di -1200 in particolare ma una raccolta di numeri che sono intorno a -1200).Esponenziale di un numero molto piccolo in python

>>> math.exp(-1200) 
0.0 

Mi sta dando un underflow; Come posso aggirare questo problema?

Grazie per qualsiasi aiuto :)

risposta

12

nella libreria standard, è possibile guardare il modulo decimal:

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

Se avete bisogno di più funzioni rispetto decimal supporti, si poteva guardare in biblioteca mpmath , che io uso e come un sacco:

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

ma, se possibile, si dovrebbe vedere se si può riformulare le vostre equazioni lavorare interamente nello spazio log.

+0

Grazie, il decimale fa ciò di cui avevo bisogno :) –

+0

Non riesco a riordinare per rimanere nello spazio di registrazione poiché sto lavorando con log a e log b e ho bisogno di un/(a ​​+ b) che richiederebbe log (a + b) che non è banale nell'ottenere quando si ha solo un log e un log b. –

4

Provare a calcolare il dominio logaritmico il più a lungo possibile. Cioè evitare di calcolare il valore esatto ma continuare a lavorare con esponenti.

exp (-1200) È un numero molto piccolo (proprio come exp (1200) è molto molto grande), quindi forse il valore esatto non è quello che ti interessa. Se hai solo bisogno di confrontare questi numeri quindi lo spazio logaritmico dovrebbe essere sufficiente.

+0

Grazie per l'input. Ho bisogno di precisione assoluta per standardizzare due di questi valori; per esempio. Ho bisogno di e^(log a)/(e^(log a) + e^log (b)), perché ho log a e log b in primo luogo perché ho usato una somma di log al contrario a un prodotto che era molto, molto, grande. –

+1

@Pi_: umm, non è 'e^(log a)/(e^(log a) + e^log (b))' semplicemente 'a/(a ​​+ b)'? – DSM

+0

@astraujums sì ma non ho un e b. Ho solo log a e log b che capita di essere piccolo o più piccolo di -1200 –

Problemi correlati