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.


Anmelden zum Antworten