Wikipedia · einfach zusammengefasst · Stand
NaN
Lässt man den komplexen Zahlenraum als Ergebnis zu, ergibt sich eine imaginäre Zahl, die eben nicht als reelle Zahl bzw. Gleitkommazahl darstellbar ist und …
Inhalt4 Abschnitte
Bedeutung und Arten
NaN („Not a Number“, auf Deutsch „Keine Zahl“) ist in der Informationstechnik ein besonderer numerischer Wert. Er steht für ein undefiniertes oder im verwendeten Zahlenformat nicht darstellbares Ergebnis und tritt vor allem bei Berechnungen mit Gleitkommazahlen auf. Systematisch verwendet wird NaN seit der Einführung des Gleitkommazahlenstandards IEEE 754 im Jahr 1985. Dieser Standard stellt auch andere nicht-finite Größen wie Unendlichkeit symbolisch dar.
Es gibt zwei Arten: Eine stille NaN (quiet NaN) wird als Ergebnis einer ungültigen Operation eingesetzt. Eine anzeigende NaN (signaling NaN) wird Variablen zugewiesen, die nicht ausdrücklich initialisiert wurden. NaN kann außerdem als Platzhalter für einen fehlenden Wert dienen.
Ein typisches Beispiel ist 0/0: Dieser Ausdruck ist als reelle Zahl undefiniert und wird daher durch NaN dargestellt. Auch die Quadratwurzel einer negativen Zahl führt bei einer reellen Gleitkommaoperation zu NaN. Im komplexen Zahlenraum wäre das Ergebnis zwar eine imaginäre Zahl, es ist aber nicht als reelle Gleitkommazahl darstellbar. Enthält mindestens ein Argument einer mathematischen Operation bereits NaN, ist auch das Ergebnis NaN.
Darstellung nach IEEE 754
NaN ist nicht dasselbe wie Unendlichkeit. Beide sind zwar Sonderfälle der Gleitkommadarstellung und erfordern besondere Regeln bei Berechnungen, doch eine ungültige Operation unterscheidet sich von einem arithmetischen Überlauf oder Unterlauf. Ein Überlauf kann Unendlich ergeben. Ein Unterlauf kann die kleinste normalisierte Zahl, eine denormalisierte Zahl oder Null ergeben.
Bei einer IEEE-754-NaN besteht das Exponentenfeld vollständig aus Einsen. Das ist auch bei Unendlichkeit der Fall. Zur Unterscheidung enthält der Signifikant bei NaN jedoch irgendeinen Wert ungleich Null. Dadurch können viele verschiedene NaN-Werte dargestellt werden, deren Bits im Signifikanten sich unterscheiden. Das Vorzeichenbit wird vom Standard bei NaNs ignoriert.
Bei einfacher Genauigkeit mit 32 Bit kann das Bitmuster einer NaN so aussehen: s111 1111 1axx xxxx xxxx xxxx xxxx xxxx. Dabei bezeichnet s das meist ignorierte Vorzeichen, a die Art der NaN und x die Nutzdaten, die ebenfalls meistens ignoriert werden. Für a = 1 liegt eine stille NaN vor. Für a = 0 und Nutzdaten ungleich Null handelt es sich um eine anzeigende NaN.
Ursachen und Sonderfälle
NaNs entstehen insbesondere in folgenden Fällen:
• Eine Operation erhält mindestens ein NaN als Operanden.
• Nichtdeterminierte Formen werden berechnet, darunter 0/0, ±∞/±∞, 0 × ±∞ und ±∞ × 0.
• Unendlichkeiten mit entgegengesetztem Vorzeichen werden addiert, also ∞ + −∞ oder −∞ + ∞. Das gilt ebenso für die dazu äquivalenten Subtraktionen.
• Eine reelle Operation hätte ein komplexes Ergebnis. Beispiele sind die Quadratwurzel oder der Logarithmus einer negativen Zahl.
• Eine Funktion wird außerhalb ihres reellen Definitionsbereichs verwendet. Der inverse Sinus oder Kosinus führt bei einem Argument kleiner als −1 oder größer als +1 zu NaN. Beim inversen hyperbolischen Tangens gilt dies für Argumente kleiner gleich −1 oder größer gleich +1, beim inversen hyperbolischen Kosinus für Argumente kleiner als +1.
Für Potenzen enthält der Standard besondere Festlegungen: Die Standardfunktion pow und die Ganzzahl-Exponentenfunktion pown definieren 0⁰, 1^∞ und ∞⁰ jeweils als 1; diese Ausdrücke ergeben dort also nicht NaN.
NaN kann auch ausdrücklich einer Variablen zugewiesen werden, typischerweise zur Darstellung eines fehlenden Wertes. Vor IEEE 754 verwendeten Programmierer dafür oft willkürlich gewählte Zahlen wie −99999999. Weil solche Spezialwerte nicht einheitlich festgelegt waren, war nicht gewährleistet, dass alle Programme und Programmierer sie konsistent und korrekt behandelten.
Erkennung im Programm
Nach einer Empfehlung des IEEE-Standards soll eine Funktion isnan() zur Verfügung stehen, mit der geprüft werden kann, ob ein Wert NaN ist. Eine weitere Erkennungsmöglichkeit beruht auf einer besonderen Vergleichseigenschaft: NaNs sind die einzigen Zahlen x, für die der Vergleich x ≠ x wahr ist.
In C ist isnan() in math.h deklariert, in Delphi beziehungsweise Lazarus in der Unit Math. Für eine Gleitkommavariable value sind deshalb die Abfragen isnan(value) und value != value gleichwertig. Ist die jeweilige Bedingung erfüllt, enthält value eine NaN, sodass das Programm eine passende Fehlerbehandlung ausführen kann.