NaN abfangen

steves

Grünschnabel
Hallo,

ich rechne in einem Programm einige Winkel aus über Math.sin und Math.cos. Dabei kann es vorgehen, dass die Zahl bei der Eingabe noch nicht existiert und Math.cos/sin NaN ausgibt. Diesen Fall würde ich gerne abfangen. Mein versuch war einen Vergleich des Ergebnisses mit Double.NaN. Doch leider scheint der Rückgabewert nicht Double.NaN zu sein. hat wer ne Ahnung oder muss ich da irgendeine Exception abfangen ?

thx
steve
 
Code:
//Drehung um die Y-Achse
Ywinkel=Math.acos((vektor_eins[0]*vektor_zwei[0]+vektor_eins[2]*vektor_zwei[2]/(Math.sqrt(vektor_eins[0]*vektor_eins[0]+vektor_eins[2]*vektor_eins[2]))*Math.sqrt(vektor_zwei[0]*vektor_zwei[0]+vektor_zwei[2]*vektor_zwei[2])));

und bei dem acos z.B. kommt nun als Wert NaN raus von welchem Typ ist dieses NaN oder wie kann ich das abfangen
 
NaN steht für "Not a number", also umgangssprachlich etwa Zahlen, die eigentlich keine sind.
Folgendes Beispiel liefert ein NaN:
Code:
double a = Double.MAX_VALUE;
a *= a; //Erzeugt eine unendliche Zahl (Überlauf)
System.out.println(a - a); //Hier wird sich geweigert 'UNENDLICH - UNENDLICH' zu rechnen --> NaN

Und man kann natürlich auch auf NaN prüfen. Dazu muss man folgendes wissen zur Klasse java.lang.Double:
Quelle: http://www.dpunkt.de/java/

public static native long doubleToLongBits(double value)
Liefert das Bitmuster von value. Bei dieser Methode werden alle Bitmuster, die nach IEEE 754 den Wert NaN darstellen auf ein einheitliches Muster normiert.

Wenn Du jetzt an mein kleines Beispiel oben folgendes Statement dranhängst, solltest Du Dein Problem lösen können:
Code:
System.out.println(Double.doubleToLongBits(a - a) == Double.doubleToLongBits(Double.NaN) ? "Not a Number" : "Number");

MfG
 
Zuletzt bearbeitet:
Hi.
Wenn es so einfach wäre hätte er in seinem Post nicht geschrieben, dass das bei ihm nicht funktioniert hat ;)
Das hat er (steves) aber nicht geschrieben. Er hat versucht NaN zu vergleichen. Laut Definition gilt aber (NaN == NaN) => false. Deshalb existiert die isNaN Methode.

\edit: Ob ein double NaN ist kann man deshalb relativ leicht auch zu Fuß prüfen:
Java:
double d = ...;

if (d != d) {
  // Not a Number!
}
Gruß
 
Zuletzt bearbeitet:
Zurück