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 = + unendlichcheck 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...
-
muffmolch schrieb:
-1.#INDs = - unendlich
und
1.#INDs = + unendlichunendlich 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.
-
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