Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Invers Cosinus Probleme (https://www.delphipraxis.net/56994-invers-cosinus-probleme.html)

Weazy 14. Nov 2005 19:22


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?

dizzy 15. Nov 2005 00:53

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:

himitsu 15. Nov 2005 03:00

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

Weazy 15. Nov 2005 10:30

Re: Invers Cosinus Probleme
 
Ich hab es gefunden! Ich runde den eingegbenen Wert einfach mit Roud()!

Vielen Dank trotzdem!

dizzy 15. Nov 2005 18:04

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 ;)

Weazy 15. Nov 2005 19:37

Re: Invers Cosinus Probleme
 
Wie denn das?

3_of_8 15. Nov 2005 19:39

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.

Weazy 15. Nov 2005 22:08

Re: Invers Cosinus Probleme
 
Wie kann man dann z.b auf 5 Stellen genau runden?

himitsu 15. Nov 2005 22:18

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), ...

3_of_8 15. Nov 2005 22:37

Re: Invers Cosinus Probleme
 
Ich hab das ganze mal getestet:

Delphi-Quellcode:
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;
Alle Befehle haben ein korrektes Ergebnis gebracht, der letzte Befehl (quod erat exspectandum) eine Exception (Ungültige Gleitkommaoperation).

himitsu 16. Nov 2005 00:59

Re: Invers Cosinus Probleme
 
@3_of_8:
Versuch es mal mit deaktivierten FPU-Exceptions :zwinker:
Delphi-Quellcode:
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;
@Weazy:
Wie du siehst gibt es "nur" Probleme, wenn z außerhalb des zulässigen Bereichs liegt.

3_of_8 16. Nov 2005 12:06

Re: Invers Cosinus Probleme
 
Was genau ist FPU? Und NaN heißt Not a Number, nicht Natriumnitrat, oder?

Daniel G 16. Nov 2005 12:15

Re: Invers Cosinus Probleme
 
Zitat:

Zitat von 3_of_8
Was genau ist FPU?

Floating-Point-Unit. Der Teil deiner CPU, der für die Gleitkommaoperationen zuständig ist. (Grob gesagt)

3_of_8 16. Nov 2005 12:50

Re: Invers Cosinus Probleme
 
Achso.

himitsu 16. Nov 2005 16:28

Re: Invers Cosinus Probleme
 
Zitat:

Zitat von 3_of_8 #12
Was genau ist FPU? Und NaN heißt Not a Number, nicht Natriumnitrat, oder?

Zitat:

Zitat von himitsu #3
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.



Alle Zeitangaben in WEZ +1. Es ist jetzt 08:44 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz