![]() |
Invers Cosinus Probleme
Hi,
ich habe da noch so ne blöde frage: wenn ich in folgender Funktion als z eine real Zahl einsetze, ist das Resultat "NAN". Wenn ich hingegen -1 einsetze ist das Ergebniss korrekterweise 180. radtodeg(arccos((z))); Wisst ihr woran das liegt? |
Re: Invers Cosinus Probleme
Was für Werte hast du denn eingegeben? Definiert ist der Arcuscosinus nur über -1..1. Alles darüber und darunter sollte jedoch eher eine Exception statt NaN liefern :gruebel:
|
Re: Invers Cosinus Probleme
Es kommt auf die Fehlerbehandlung an, wenn diese abgestellt ist, wird korrekter Weise NaN (Not a Number) zurückgegeben, wenn sich ein Fehler ereignet hat.
Und wwie dizzy schon sagte, was gibts du für Werte dort ein? Diese dürfen ja schließlich nur in einem bestimmten Bereich liegen. -1 <= Z <= 1 |
Re: Invers Cosinus Probleme
Ich hab es gefunden! Ich runde den eingegbenen Wert einfach mit Roud()!
Vielen Dank trotzdem! |
Re: Invers Cosinus Probleme
Äääähm, damit sorgst du dafür dass arccos() ganze 3 mögliche Ergebnisse liefert - und das ist gewiss nicht akkurat :roll:. Eine wirkliche Lösung des Problems kann das imho nicht sein ;)
|
Re: Invers Cosinus Probleme
Wie denn das?
|
Re: Invers Cosinus Probleme
:shock:
Ganz einfach: Dann hast du entweder: -1,0, oder 1. Und damit auch nur drei verschiedene Ergebnisse. Das bringts auch voll. |
Re: Invers Cosinus Probleme
Wie kann man dann z.b auf 5 Stellen genau runden?
|
Re: Invers Cosinus Probleme
Ganz genau Runden geht eh nicht ... liegt halt an der internen Struktur der Typen (Single, Double...).
Aber du kannst es so machen: X := Runden(X * 10^5) / 10^5;
Delphi-Quellcode:
X := Round(X * 100000) / 100000;
Und hast du mal nachgesehn, was du für Werte in z übergibst? Notfalls mal vorher testen:
Delphi-Quellcode:
If (z < -1) or (z > 1) Then
MessageBox('Fehler: ' + FloatToStr(z), ... |
Re: Invers Cosinus Probleme
Ich hab das ganze mal getestet:
Delphi-Quellcode:
Alle Befehle haben ein korrektes Ergebnis gebracht, der letzte Befehl (quod erat exspectandum) eine Exception (Ungültige Gleitkommaoperation).
with memo1.lines do
begin add(floattostr(radtodeg(arccos(-1)))); add(floattostr(radtodeg(arccos(-0.75)))); add(floattostr(radtodeg(arccos(0)))); add(floattostr(radtodeg(arccos(0.75)))); add(floattostr(radtodeg(arccos(1)))); add(floattostr(radtodeg(arccos(1.0001)))); end; |
Re: Invers Cosinus Probleme
@3_of_8:
Versuch es mal mit deaktivierten FPU-Exceptions :zwinker:
Delphi-Quellcode:
@Weazy:
var
Saved8087CW: Word; begin Saved8087CW := Default8087CW; Set8087CW($133f); with memo1.lines do begin add(floattostr(radtodeg(arccos(-1.0001)))); add(floattostr(radtodeg(arccos(-1)))); add(floattostr(radtodeg(arccos(-0.75)))); add(floattostr(radtodeg(arccos(0)))); add(floattostr(radtodeg(arccos(0.75)))); add(floattostr(radtodeg(arccos(1)))); add(floattostr(radtodeg(arccos(1.0001)))); end; Set8087CW(Saved8087CW); end; Wie du siehst gibt es "nur" Probleme, wenn z außerhalb des zulässigen Bereichs liegt. |
Re: Invers Cosinus Probleme
Was genau ist FPU? Und NaN heißt Not a Number, nicht Natriumnitrat, oder?
|
Re: Invers Cosinus Probleme
Zitat:
|
Re: Invers Cosinus Probleme
Achso.
|
Re: Invers Cosinus Probleme
Zitat:
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 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