AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Sinus-Problem

Ein Thema von Socke_SG · begonnen am 13. Okt 2009 · letzter Beitrag vom 13. Okt 2009
Antwort Antwort
gammatester

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

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
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:49 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz