Forum: PC-Programmierung Floating Point Fehler: Was passiert da?


von daniel (Gast)


Lesenswert?

Hintergrund für das Folgende ist die Formel
limes n->inf (1+x/n)^n = exp(x)

mit x = 1 ergibt sich eine Nährung
seltsamerweise taucht ein Sprung in der Approximation auf
wenn n von 1e14 auf 1e15 um den Faktor 1000 wächst.

octave.exe:19> dx=(1+1/1e14)^1e14 - exp(1)
dx = -0.00217179437202208
octave.exe:20> dx=(1+1/1e15)^1e15 - exp(1)
dx =  0.316753378090217

ok, könnte man die Idee haben, dass es ein Bug ist
deswegen schnell in Python ausprobiert

|4> import math
|5> (1+1/1e14)**1e14 - math.exp(1)
  <5> -0.0021717943720220845
|6> (1+1/1e15)**1e15 - math.exp(1)
  <6> 0.31675337809021675

da beide auf C double stützen, ist eigentlich redundant
es nochmal in C++ auszuprobieren.

Was passiert da?
Wird die Potenzierung 'naive' in einer Schleife durchmultipliziert,
und dabei baut sich so ein grosser Fehler auf?

Grüsse

von Andreas K. (a-k)


Lesenswert?

Such dir mal ein Programm mit grösserer Rechengenauigkeit als IEEE 
double precision und probiers damit nochmal.

Double hat ja von Haus aus nur 15-16 Dezimalstellen, und 
1+1/1e15=1,000000000000001 sind 16 Dezimalstellen.

M.a.W: Diese Formel nähert sich irgendwann nicht mehr exp(x) weil die 
Rechengenauigkeit dafür nicht ausreicht.

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.