if( x==NaN ) ...!?!
-
Hallo,
ich möchte wissen, ob das Ergebnis einer Berechnung den Wert "NaN" geliefert hat. Simple Vergleiche sind meineswissens nicht geeignet. Eine Exception bei der Berechnung möchre ich nicht auslösen.
Visual C++ kennt wohl:int _isnan( double x );
Gibt es da eine elegantere C++ Lösung?
Danke!
-
Hallo,
aus der Menge der Antworten, schließe ich mal auf die Kniffeligkeit der Problematik...
Jetzt kommt gleich noch die Erweiterung:
Die Funktion _isnan() reagiert nicht auf unendlich große oder kleine Zahlen, die in meinem Zusammenhang auch auf ein Problem hindeuten.
Wie sieht es damit aus?
-
_finite?
-
Wenn eine Zahl NaN enthält, kann man das laut irgendeinem IEEE-Standard theoretisch mit einem Test auf Ungleichheit herausfinden.
const double x = sqrt(-1); if (x!=x) { cout << "## NAN ##" << endl; }
Der Haken bei der Sache: Nicht alle Compilerhersteller halten sich an den Standard. Visual C++ ist z.B. ein solcher Kandidat.
Deshalb muss man dort auf compilerspezifische Funktionen ausweichen. Beim Visual Studio ist das das _finite() und nicht _isnan(), weil obige Funktion (fälschlicherweise) #Inf zurückgibt anstatt NaN.
-
in C gibts isnan und isinf, in C++ leider (noch?) nicht. Vielleicht kann man mit std::numeric_limits was anfangen ...
-
Es gibt C99 standard funktionen aber ich habe zweifel daran, dass C++ etwas definiert.
-
Harleen schrieb:
...
Der Haken bei der Sache: Nicht alle Compilerhersteller halten sich an den Standard. Visual C++ ist z.B. ein solcher Kandidat.
...ist ja klar, wann hält sich MS schon an standards...??
-
Wieso compiliert das? sqrt hat überladungen für long double, double und float; nicht aber für int. Folglich ist der Aufruf nicht eindeutig.
-
Hallo,
Bashar schrieb:
sqrt hat überladungen für long double, double und float; nicht aber für int
aber nicht in den "Standard"(
)-Headern des VC6-Compilers ;), da gibt's nur die double-Version
MfG
-
Hallo und vielen Dank für die Antworten!
Ich nehme erstmal _finite(), das hält sich wenigstens an seine eigenen Standards. Schade, daß es da offenbar (noch) nichts allgemeingültiges gibt.