NaN

aus Wikipedia, der freien Enzyklopädie
Wechseln zu: Navigation, Suche
Dieser Artikel beschäftigt sich mit einem speziellen Wert von Gleitkommazahlen. Zu anderen Bedeutungen des Wortes Nan siehe Nan (Begriffsklärung).

In der Informatik steht NaN (englisch für „Not a Number“ – „Keine Zahl“) für einen numerischen Datentyp-Wert, der einem undefinierten oder nicht darstellbaren Wert entspricht, und kommt insbesondere bei Gleitkommazahlberechnungen vor. NaN erlangte systematische Verwendung mit der Einführung des IEEE-754-Gleitkommazahlenformats im Jahr 1985, in dem auch andere nicht-finite Größen wie Unendlichkeit symbolisch dargestellt werden.

Es werden zwei verschiedene NaN-Arten verwendet: stille NaNs (engl. quiet NaN) und anzeigende NaNs (engl. signaling NaN). Stille NaNs werden für das Weiterleiten von Fehlern eingesetzt, die sich durch ungültige Operationen oder Werte ergeben. Anzeigende NaNs hingegen unterstützen fortgeschrittene Eigenschaften wie gemischte numerische und symbolische Berechnungen oder andere grundlegende Gleitkommaarithmetik. Beispielsweise ist das Ergebnis von 0/0 als reelle Zahl undefiniert und wird mit NaN dargestellt. Ein anderes Beispiel ist das Ergebnis der Quadratwurzel einer negativen Zahl. Es ergibt sich eine imaginäre Zahl, die nicht als reelle Gleitkommazahl darstellbar ist und daher durch NaN ersetzt wird. Weiterhin werden NaNs eingesetzt, um fehlende Werte in Berechnungen darzustellen.

Gleitkommazahlen[Bearbeiten]

Bei Gleitkommazahlberechnungen entspricht NaN nicht der Unendlichkeit, wenngleich beides Sonderfälle sowohl in der Wertdarstellung als auch bezüglich der möglichen Gleitkommaoperationen sind. Eine ungültige Operation entspricht nicht einem arithmetischen Überlauf (der Unendlich zurückgeben könnte) oder einem arithmetischen Unterlauf (der die kleinste normale Zahl, eine denormale Zahl oder Null zurückgeben würde).

IEEE-754-NaNs werden dargestellt, indem das Exponenten-Feld mit Einsen gefüllt wird (wie bei der Darstellung von Unendlichkeit) und irgendeine Zahl ungleich Null in den Signifikant geschrieben wird (im Unterschied zu Unendlich).[1][2] Diese Darstellung erlaubt es, viele verschiedene NaN-Werte zu definieren, die sich durch die Bits des Signifikanten unterscheiden lassen. Der Standard ignoriert das Vorzeichenbit.[1]

Ein bitweises Beispiel: Eine IEEE-754-Gleitkommazahl mit einfacher Genauigkeit (32 Bit), die NaN darstellt, wäre s111 1111 1axx xxxx xxxx xxxx xxxx xxxx, wobei s dem bei NaNs meistens ignorierten Vorzeichen entspricht, a den NaN-Typ bestimmt (still oder anzeigend) und x für die Nutzdaten steht (die auch meistens ignoriert werden). Ist a = 1, so handelt es sich um eine stille NaN; sind dagegen a = 0 und die Nutzdaten ungleich Null, so ist es eine anzeigende NaN.[2]

Entstehung von NaNs[Bearbeiten]

NaNs entstehen auf drei verschiedene Arten:

  • Operationen, deren Operanden mindestens einmal ein NaN enthalten
  • Nichtdeterminierte Formen
    • Die Division 0 / 0 und ±∞ / ±∞
    • Die Multiplikation 0 × ±∞ und ±∞ × 0
    • Die Additionen ∞ + −∞, −∞ + ∞ und die dazu äquivalenten Subtraktionen.
    • Der Standard verfügt über unterschiedliche Funktionen zur Potenz-Rechnung:
      • Die Standard-Funktion pow und die Ganzzahl-Exponent-Funktion pown definieren 00, 1 und ∞0 als 1
      • Die Funktion powr definiert alle drei nichtdeterminierten Formen als ungültige Operationen und gibt NaN zurück.
  • Reelle Operationen mit komplexem Ergebnis, zum Beispiel
    • Die Quadratwurzel einer negativen Zahl
    • Den Logarithmus einer negativen Zahl
    • Der inverse Sinus oder Kosinus einer Zahl, die kleiner −1 oder größer +1 ist.
    • Der inverse hyperbolische Tangens einer Zahl, die kleiner gleich −1 oder größer gleich +1 ist.
    • Der inverse hyperbolische Kosinus einer Zahl, die kleiner als +1 ist.

NaNs können auch explizit Variablen zugewiesen werden, z.B. typischerweise als Repräsentation eines fehlenden Wertes. Bevor es den IEEE-Standard gab, nutzten Programmierer häufig bestimmte Werte (wie −99999999), um undefinierte oder fehlende Werte darzustellen; es kam jedoch regelmäßig zu Problemen, da diese Werte nicht einheitlich gewählt wurden, sodass keine Garantie bestand, dass die Spezialwerte von allen Programmierern konsistent und korrekt verwendet wurden.

Erkennung und Abfangen von NaNs[Bearbeiten]

Nach einer Empfehlung des IEEE-Standards sollte es eine Funktion isnan() geben, mit der ein NaN erkannt werden kann. Da für NaNs der Vergleich x \ne x wahr ist, kann man auch diesen Vergleich zur Erkennung von NaNs verwenden.[1][2]

In C ist die Funktion isnan() in math.h deklariert, so dass für eine Gleitkommavariable value die beiden folgenden Abfragen äquivalent sind:

  if ( isnan( value ) ) {
    // value ist NaN, Fehlerbehandlung ...
  }
 
  if ( value != value ) {
    // value ist NaN, Fehlerbehandlung ...
  }

Einzelnachweise[Bearbeiten]

  1. a b c http://754r.ucbtest.org/standards/754.pdf
  2. a b c http://www.validlab.com/goldberg/paper.pdf