![]() |
Re: Sinus-Problem
Zitat:
|
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 |
Re: Sinus-Problem
Zitat:
|
Re: Sinus-Problem
Sorry, hast natürlich recht, meine bisher auch :wall:
Gruß Wolfgang [Edit] Schnell korrigiert, damit es sonst keiner merkt [/Edit] |
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:
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 ??)FSIN FNSTSW AX SAHF JP @@outOfRange RET @@outOfRange: FSTP st(0) { for now, return 0. result would } FLDZ { have little significance anyway } 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 ![]()
Code:
@Socke_SG: Wenn Du also nicht gerade Zillionen Werte ausrechnen mußt, wär das doch vielleicht was für Dich?
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 Gruß Gammatester |
Alle Zeitangaben in WEZ +1. Es ist jetzt 13:28 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