Probleme mit 1.#QNAN



  • ich habe einen recht komplexen algorithmus in c++ geschrieben. leider entstehen bei der berechnung 1.#QNAN. kann mir jemand sagen, wofür 1.#QNAN steht, bei welcher rechenopperation eine 1.#QNAN entstehen kann und wie man sie zur not abfangen kann?



  • "1.#QNAN" ist ein NaN-Wert (Not A Number) und entsteht vorzugsweise bei Operationen, die mathematisch nicht definiert sind, z.B. sqrt(-1) (nein, das rechnet nicht in komplexen Zahlen) oder bei 0/0.



  • ich habe in meinen algorithmus noch ein wenig weiter geschaut. zuerst treten -1.#INDs auf, die dann zu 1.#QNANs führen. ist -1.#IND ein minus unendlich?

    und wie kann ich soetwas abfangen? ich habe da an eine exception oder soetwas gedacht.



  • naja, du solltest bei divisionen immer überprüfen ob der "teiler" gleich Null ist (ACHTUNG: bei floating point variablen musst du hier einen eps-check mit einbauen).
    ob ein bereits berechneter werd NAN ist kannst du hiermizt testen:

    //double x; bool b = UbMath::isNaN(x);
       template<typename T>
       inline bool isNaN(const T& x)
       {
          return std::numeric_limits<T>::has_quiet_NaN && (x != x);
       }
    


  • PaRu schrieb:

    ich habe in meinen algorithmus noch ein wenig weiter geschaut. zuerst treten -1.#INDs auf, die dann zu 1.#QNANs führen. ist -1.#IND ein minus unendlich?

    und wie kann ich soetwas abfangen? ich habe da an eine exception oder soetwas gedacht.

    -1.#INDs = - unendlich
    und
    1.#INDs = + unendlich

    check mit:

    //double x; bool b = UbMath::isInfinity(x);
       template<typename T>
       inline bool isInfinity(const T& value)
       {
          if(value==getNegativeInfinity<T>()) return true;
          if(value==getPositiveInfinity<T>()) return true;
          return false;
       }
    


  • den in den obigen Bsps angegebene namespace UbMath brauchst du nicht verwenden. Da liegen nur bei uns diese Funktionen...


  • Mod

    muffmolch schrieb:

    -1.#INDs = - unendlich
    und
    1.#INDs = + unendlich

    unendlich sollte ±1.INF[inite] sein (und ist kein NaN - zum Beispiel 1/0) - ±1.IND[efinite] steht dagegen für schlicht undefinierte Ergebnisse - wie eben z.B. 0/0, ∞/∞, ∞-∞ u.ä.



  • ich dachte bei division durch null, beendet sich ein programm von selbst?

    das einzige, was ich mir vorstellen könnte, wie bei mir ein 1#IND ensteht, ist mit der log()-funktion.


  • Mod

    PaRu schrieb:

    ich dachte bei division durch null, beendet sich ein programm von selbst?

    das einzige, was ich mir vorstellen könnte, wie bei mir ein 1#IND ensteht, ist mit der log()-funktion.

    wenn dein Argument negativ ist? bei Null würde ich als Ergebnis noch -∞ erarten, allerdings könnte das Weiterverwenden dieser Unendlichkeit dann noch schnell zu etwas Undefiniertem führen, schon etwa die Multiplikation mit 0


Anmelden zum Antworten