- NaN
-
NaN (engl. Not a Number) bedeutet "keine Zahl". Es handelt sich hierbei um einen speziellen Wert bestimmter Darstellungen von Gleitkommazahlen auf dem Rechner, der als Ergebnis einer ungültigen Rechenoperation zurückgegeben wird. Insbesondere haben die heute weit verbreiteten Gleitkommadarstellungen nach IEEE 754 bzw. IEC 559 NaNs.
Als Ergebnis einer Berechnung wird immer dann NaN geliefert, wenn ein Ergebnis nach mehreren, sich widersprechenden Regeln berechnet werden könnte, keine reelle Zahl (oder eine der beiden Unendlichkeiten) ergäbe, oder bereits NaN als Argument an der Berechnung beteiligt ist.
Dabei ist +Inf (für Infinity = unendlich) eine Gleitkommazahl, die sowohl extrem große Zahlen als auch einen positiv unendlichen Wert repräsentiert. Daneben gibt es −Inf für einen negativ unendlichen Wert.
Berechnungen, welche zu NaN führen
Berechnung an einem reellen Argument, welches ein komplexes Ergebnis ergibt. Beispielsweise liefert die Quadratwurzel oder der Logarithmus einer negativen Zahl, oder wenn der Betrag des Argumentes bei einer Arkusfunktion größer als 1 ist, NaN.
Wenn ein Ausdruck unbestimmt ist, wie beispielsweise:
- Die Division 0/0 und ±∞/±∞
- Die Multiplikation 0×±∞ und ±∞×0
- Die Additionen ∞ + (−∞), (−∞) + ∞ und die dazu äquivalenten Subtraktionen.
Weiters führen alle Ausdrücke mit NaN wieder zu NaN. Beispielsweise liefert NaN + 1 das Ergebnis NaN.
Darstellung
Es gibt nicht nur einen NaN-Wert, sondern viele verschiedene. Bei einfacher Genauigkeit mit 32 Bit nach dem Standard IEEE 754 besitzt eine NaN folgende binäre Darstellung, bestehend aus 32 Bits:
- s111 1111 1axx xxxx xxxx xxxx xxxx xxxx
mit s dem Vorzeichenbit und a den Typ von NaN. Wenn a und alle x gleich 0 sind, handelt es sich um eine anzeigende NaN (englisch signalling NaN abgekürzt sNaN) . Ist a gleich 1 wird eine im Standard definierte sogenannte stille NaN (englisch quiet NaN abgekürzt qNaN) mit x als Argument signalisiert, welche unter anderem zur Signalisierung von +Inf bzw. -Inf dient. Zur Erkennung einer NaN bei einfacher Genauigkeit prüft ein IEEE 754-Rechenwerk die Stellen mit 1 mittels Konjunktion (logisches UND).
Der Unterschied zwischen den verschiedenen NaN-Typen liegt im Bereich der Software und wie mit der weiteren Programmausführung verfahren werden soll: Bei qNaNs liefern die arithmetischen Operationen selber wiederum qNaN zurück, wenn eines ihrer Argumente qNaN ist ohne dabei das Programm abzubrechen. Eine sNaN hingegen sollte im Bereich des Programmablaufs einen Laufzeitfehler auslösen, um den Rechenfehler anzuzeigen bzw. aufzeichnen zu können. Die konkrete Reaktion auf eine sNaN liegt im Ermessen des Programmierers.
Vergleicht man zwei NaNs auf Gleichheit, dann besteht Ungleichheit.
Quellen
- Standard IEEE 754-1985 (PDF; 50 kB)
Wikimedia Foundation.