Dieser Artikel beschaftigt sich mit dem numerischen Datentypwert. Zu anderen Bedeutungen siehe
Nan (Begriffsklarung)
.
In der
Informationstechnik
steht
NaN
(englisch fur ?Not a Number“ ? ?Keine Zahl“) fur einen
numerischen
Datentyp
-Wert, der einem undefinierten oder nicht darstellbaren Wert entspricht, und kommt insbesondere bei
Gleitkommazahlberechnungen
vor. NaN erlangte systematische Verwendung mit der Einfuhrung des
IEEE-754
-Gleitkommazahlenformats im Jahr 1985, in dem auch andere nicht-finite Großen wie Unendlichkeit symbolisch dargestellt werden.
Es werden zwei verschiedene NaN-Arten verwendet: stille NaNs (engl.
quiet NaN
) und anzeigende NaNs (engl.
signaling NaN
). Anzeigende NaNs werden Variablen zugewiesen, die nicht explizit initialisiert wurden. Stille NaNs hingegen werden als Ergebnis von eigentlich ungultigen Operationen eingesetzt.
[1]
Beispielsweise ist das Ergebnis von
als
reelle Zahl
undefiniert und wird mit NaN dargestellt. Ein anderes Beispiel ist das Ergebnis der Quadratwurzel einer negativen Zahl. Es ergibt sich eine
imaginare Zahl
, die nicht als reelle Gleitkommazahl darstellbar ist und daher durch NaN ersetzt wird. Außerdem erzeugt jede mathematische Operation, von der ein Argument NaN ist, ebenfalls NaN als Ergebnis. NaN wird des Weiteren als einfacher Platzhalter verwendet.
Bei Gleitkommazahlberechnungen entspricht NaN nicht der
Unendlichkeit
, wenngleich beides Sonderfalle sowohl in der Wertdarstellung als auch bezuglich der moglichen Gleitkommaoperationen sind. Eine ungultige Operation entspricht nicht einem
arithmetischen Uberlauf
(der Unendlich zuruckgeben konnte) oder einem
arithmetischen Unterlauf
(der die kleinste
normalisierte Zahl
, eine
denormalisierte Zahl
oder
Null
zuruckgeben wurde).
IEEE-754-NaNs werden dargestellt, indem das Exponenten-Feld mit Einsen gefullt wird (wie bei der Darstellung von Unendlichkeit) und irgendeine Zahl ungleich Null in den Signifikant geschrieben wird (im Unterschied zu Unendlich).
[2]
[3]
Diese Darstellung erlaubt es, viele verschiedene NaN-Werte zu definieren, die sich durch die Bits des Signifikanten unterscheiden lassen. Der Standard ignoriert das
Vorzeichenbit
.
[2]
Ein bitweises Beispiel: Eine IEEE-754-Gleitkommazahl mit einfacher Genauigkeit (32 Bit), die NaN darstellt, ware 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
fur 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.
[3]
NaNs entstehen auf 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 aquivalenten Subtraktionen.
- Der Standard verfugt uber unterschiedliche Funktionen zur
Potenz-Rechnung
:
- Die Standard-Funktion pow und die Ganzzahl-Exponent-Funktion pown definieren 0
0
, 1
∞
und ∞
0
als 1
- 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 großer +1 ist.
- Der inverse hyperbolische Tangens einer Zahl, die kleiner gleich ?1 oder großer gleich +1 ist.
- Der inverse hyperbolische Kosinus einer Zahl, die kleiner als +1 ist.
NaNs konnen auch explizit Variablen zugewiesen werden, z. B. typischerweise als Reprasentation eines fehlenden Wertes. Bevor es den IEEE-Standard gab, nutzten Programmierer haufig bestimmte Werte (wie ?99999999), um undefinierte oder fehlende Werte darzustellen; es kam jedoch regelmaßig zu Problemen, da diese Werte nicht einheitlich gewahlt wurden, sodass keine Garantie bestand, dass die Spezialwerte von allen Programmierern konsistent und korrekt verwendet wurden.
Nach einer Empfehlung des IEEE-Standards sollte es eine Funktion
isnan()
geben, mit der ein NaN erkannt werden kann. Da NaNs die einzigen Zahlen
sind,
bei denen der Vergleich
wahr ist, kann man auch diesen Vergleich zur Erkennung von NaNs verwenden.
[2]
[3]
In
C
ist die Funktion
isnan()
in
math.h
, in Delphi (Lazarus) in der Unit
Math
, deklariert, so dass fur eine Gleitkommavariable
value
die beiden folgenden Abfragen aquivalent sind:
if
(
isnan
(
value
))
{
// value ist NaN, Fehlerbehandlung ...
}
if
(
value
!=
value
)
{
// value ist NaN, Fehlerbehandlung ...
}
- ↑
Gerhard Goos
:
Vorlesungen uber Informatik: Band 1: Grundlagen und funktionales Programmieren.
Springer, Berlin Heidelberg, 1995, 1997,
ISBN 978-3-540-62880-4
, S. 365
- ↑
a
b
c
http://754r.ucbtest.org/standards/754.pdf
@1
@2
Vorlage:Toter Link/754r.ucbtest.org
(
Seite nicht mehr abrufbar
, festgestellt im Mai 2019.
Suche in Webarchiven
)
- ↑
a
b
c
http://www.validlab.com/goldberg/paper.pdf