Thema: Delphi Sinus-Problem

Einzelnen Beitrag anzeigen

gammatester

Registriert seit: 6. Dez 2005
999 Beiträge
 
#15

Re: Sinus-Problem

  Alt 13. Okt 2009, 22:47
Delphi und Rechengenauigkeit: Das ist leider eine sehr traurige Geschichte. Hier für sin/cos: Die Güte der Implementation nimmt mit den Versionsnummern monoton ab. Für große Argumente wie sin(1e19) signalisiert die FPU ein 'Out of range'. Borland Pascal 7 wirft noch ein RTE 207 (wie's eigentlich sein sollte), bis Delphi 7 wird gecheckt, ob dieser Fall eintritt; dann sin := 0 und cos := 0 gesetzt,

Code:

        FSIN
        FNSTSW AX
        SAHF
        JP     @@outOfRange
        RET
@@outOfRange:
        FSTP   st(0)  { for now, return 0. result would      }
        FLDZ           { have little significance anyway      }
Irgendwie scheint man bei Borland/Codegier zu hoffen, daß trotzdem noch sin^2 + cos^2 = 1 gilt. Delphi 10 und höher treiben es noch wilder in dem sie (wie schon gemerkt) einfach sin=1e19, cos=1e19 liefern und noch mehr hoffen (2*1e38 = 1 ??)

Natürlich ist sin(1e19) = sin(1e19 mod 2*pi). Das Problem ist also die Reduktion modulo 2*pi. Für sin(1e19) kann man diese Reduktion zB mit double-double Arithmetik angehen. Oder man benutzt gleich Multipräzisionsarithmetik für alle Funktionen.

Mein Delphi-Implementation MPArith rechnet wie folgt:

Code:
Test of MPArith V1.13.03 (15/16 bit) [mp_rcalc]  (c) W.Ehrhardt 2008-2009
Karatsuba cutoffs: mul/sqr = 64/96
Toom-3, BZ cutoffs: mul/sqr = 128/192, div = 96
Type "?<enter>" to get some info about commands, "\q" or "quit" to end.
Current bit precision = 240, decimal precision = 72.2

[D]:=> prec 128
New bit precision = 128, decimal precision = 38.5
[D]:=> x=sin(1e19)
X = -9.2706316604865038523412228966493597547E-1
Time = 0.275 ms
[D]:=> y=cos(1e19)
Y = -3.7490516955071783015322054600961073097E-1
Time = 0.214 ms
[D]:=> x*x + y*y - 1
Result = 0.0000000000000000000000000000000000000
Time = 0.050 ms
@Socke_SG: Wenn Du also nicht gerade Zillionen Werte ausrechnen mußt, wär das doch vielleicht was für Dich?

Gruß Gammatester
  Mit Zitat antworten Zitat