2012-10-29 14 views
9

Ich versuche, das Exponential von -1200 in Python zu berechnen (es ist ein Beispiel, ich brauche nicht -1200 insbesondere aber eine Sammlung von Zahlen, die rund -1200 sind).Exponential von sehr kleiner Zahl in Python

>>> math.exp(-1200) 
0.0 

Es gibt mir einen Unterlauf; Wie kann ich dieses Problem umgehen?

Vielen Dank für jede Hilfe :)

Antwort

12

In der Standard-Bibliothek, können Sie am decimal Modul aussehen:

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

Wenn Sie mehr Funktionen als decimal Stützen benötigen, können Sie in der Bibliothek aussehen könnte mpmath , die ich verwenden und wie viele:

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

aber wenn möglich, sollten Sie sehen, ob Sie Ihre Gleichungen Neufassung können vollständig im Protokollbereich arbeiten.

+0

Danke, Dezimal tut was ich brauchte :) –

+0

Ich konnte nicht umschreiben, um im Protokollbereich zu bleiben, da ich mit Protokoll a und Protokoll b arbeite und ein/(a ​​+ b) brauche, das log (a + b) was nicht trivial ist, wenn man nur log a und log b hat. –

4

Versuchen Sie, in der logarithmischen Domäne so lange wie möglich zu berechnen. I.e. vermeiden Sie es, den genauen Wert zu berechnen, aber arbeiten Sie weiter mit Exponenten.

exp (-1200) ist eine sehr, sehr kleine Zahl (genauso wie exp (1200) ist eine sehr sehr große), also ist vielleicht der genaue Wert nicht wirklich das, was Sie interessiert. Wenn Sie nur vergleichen müssen diese Zahlen dann logarithmischen Raum sollte ausreichen.

+0

Vielen Dank für Ihre Eingabe. Ich brauche absolute Präzision, um zwei solche Werte zu standardisieren; z.B. Ich brauche e^(log a)/(e^(log a) + e^log (b)), warum ich log a und log b an erster Stelle habe, weil ich eine Summe von logs im Gegensatz dazu verwendet habe zu einem Produkt, das sehr, sehr, groß war. –

+1

@Pi_: Ähm, ist nicht 'e^(log a)/(e^(log a) + e^log (b))' einfach 'a/(a ​​+ b)'? – DSM

+0

@astraujums ja, aber ich habe keine a und b. Ich habe nur log a und log b, die zufällig so klein oder kleiner als -1200 –