Genauigkeit von math.exp

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Curiosa
User
Beiträge: 10
Registriert: Freitag 4. März 2011, 15:04

Hallo!
Ich wuerde mich sehr ueber Eure Hilfe freuen, da ich schon seit gestern ohne Erfolg nach einer Loesung suche.
Ich benutze die Funktion math.exp. In meinem Fall sind die Zahlen, auf die ich sie anwende leider sehr, sehr klein. Deshalb erhalte ich als Ergebnis immer null.
Gibt es die Moeglichkeit die Genauigkeit heraufzusetzen oder gibt es eine andere Exponentialfunktion, die genauer ist?
Vielen Dank schon einmal fuer Eure Hilfe!
Viele Gruesse,
Curiosa
BlackJack

@Curiosa: Also ich erhalte bei sehr kleinen Werten 1 und nicht 0!?

Code: Alles auswählen

In [300]: math.exp(0)
Out[300]: 1.0

In [301]: math.exp(1e-200)
Out[301]: 1.0
Curiosa
User
Beiträge: 10
Registriert: Freitag 4. März 2011, 15:04

Ich meine nicht vom Betrag her klein, sondern negative Zahlen.
mushroom
User
Beiträge: 58
Registriert: Sonntag 21. November 2010, 12:32

Hmm, also wenn ich dich dann richtig verstanden habe, meinst du sehr große negative Zahlen. Ich erhalte für x = 744 ein nicht Nullergebnis

Code: Alles auswählen

>>> math.exp(-744)
9.8813129168249309e-324
Das Ergebnis ist wirklich schon mächtig klein und quasi Null. Wofür brauchst du denn solch kleine Zahlen?

Laut http://docs.python.org/library/math.html gibt es ab Version 2.7 wohl expm1(), was die Genauigkeit erhöhen soll. Habe selbst nur Version 2.6 und kann es daher nicht testen.
Zuletzt geändert von mushroom am Dienstag 8. März 2011, 11:25, insgesamt 1-mal geändert.
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

Curiosa hat geschrieben:Ich meine nicht vom Betrag her klein, sondern negative Zahlen.
Evtl. hilft decimal.Decimal

Code: Alles auswählen

from decimal import Decimal
print Decimal(-10000).exp()
mushroom
User
Beiträge: 58
Registriert: Sonntag 21. November 2010, 12:32

Da muß man dann nur darauf achten, daß Ergebnis richtig zu interpretieren:

Code: Alles auswählen

>>> from decimal import Decimal
>>> Decimal(-744).exp()
7.671944704179979073949774304E-324
>>> math.exp(-744)
9.8813129168249309e-324
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

mushroom hat geschrieben:Da muß man dann nur darauf achten, daß Ergebnis richtig zu interpretieren:
Hättest du auch die Güte, uns den Grund deines Einwandes zu erklären? Decimal rechnet nämlich richtig. So zwei erläuterungsfrei hingeklatschte Zahlen helfen keinem.
mushroom
User
Beiträge: 58
Registriert: Sonntag 21. November 2010, 12:32

Darii hat geschrieben:Hättest du auch die Güte, uns den Grund deines Einwandes zu erklären? Decimal rechnet nämlich richtig. So zwei erläuterungsfrei hingeklatschte Zahlen helfen keinem.
Naja viel zu erläutern gibt es nicht wirklich bei meinen "dahingeklatschten" Ergebnissen. Sie wurden eben auf meinem Rechner so berechnet, wie sie da stehen.
Inwieweit Decimal richtig rechnet, kann ich nicht beurteilen, genauso wenig wie math richtig rechnet. Was macht denn Decimal anders als math?
Darii
User
Beiträge: 1177
Registriert: Donnerstag 29. November 2007, 17:02

mushroom hat geschrieben:Naja viel zu erläutern gibt es nicht wirklich bei meinen "dahingeklatschten" Ergebnissen. Sie wurden eben auf meinem Rechner so berechnet, wie sie da stehen.
Inwieweit Decimal richtig rechnet, kann ich nicht beurteilen, genauso wenig wie math richtig rechnet.
Dein Satz klang halt so als wüsstest du was da vor sich geht und dass du es dem Leser überläßt da selbst drauf zu kommen.
Was macht denn Decimal anders als math?
Grob gesagt, Decimal macht die Rechnung "per Hand" während math auschließlich mit normalen Fließkommazahlen rechnet. Die Abweichung sind dann einfach Rundungsfehler.
mushroom
User
Beiträge: 58
Registriert: Sonntag 21. November 2010, 12:32

Nee nee, bin Anfänger in Python, habe mit meinem Projekt zwar schon gute Fortschritte gemacht, aber wenn jemand von den Experten hier über meinen Code schaut, wird er sich wohl die Hände über dem Kopf zusammenschlagen :-)

Will mich nur an dem Forum etwas aktiver beteiligen, dadurch lernt man ja auch dazu.
Antworten