Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Sinus-Problem (https://www.delphipraxis.net/141667-sinus-problem.html)

DeddyH 13. Okt 2009 18:32

Re: Sinus-Problem
 
Zitat:

Zitat von Wolfgang Mix
Mach' Dich 'mal bitte über Frequenz und Periodendauer schlau.

[OT] Das waren doch so 4 bis 5 Tage, oder nicht? :mrgreen: (Sry, es war stärker als ich ^^) [/OT]

Wolfgang Mix 13. Okt 2009 18:38

Re: Sinus-Problem
 
Die fachliche Antwort lautet:

Bei 50 Hertz sind es 20 Millisekunden, also weeeesentlich weniger als Du dachtest :-D

Topic on


Gruß

Wolfgang

Matze 13. Okt 2009 18:43

Re: Sinus-Problem
 
Zitat:

Zitat von Wolfgang Mix
Integerwerte machen bei Sinus/Cosinus sowieso keinen Sinn, denn Minimalwerte sind 0
und Maximalwerte sind 1.
[Edit] Alle wirklich interessanten Werte liegen dazwischen [/Edit]

Meine lagen immer zwischen -1 und +1 :zwinker:

Wolfgang Mix 13. Okt 2009 18:46

Re: Sinus-Problem
 
Sorry, hast natürlich recht, meine bisher auch :wall:

Gruß

Wolfgang

[Edit] Schnell korrigiert, damit es sonst keiner merkt [/Edit]

gammatester 13. Okt 2009 22:47

Re: Sinus-Problem
 
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


Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 Uhr.
Seite 2 von 2     12   

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