Es gibt eine gute Beschreibung von NaN und der häufigsten Fallstricke bei der Verwendung von NaN in Java: ppkwok.blogspot.co.uk/2012/11/…
Phil
Wenn Sie fragen "Was nützt NaN?" In Java (oder einer anderen Sprache) kann ich Ihnen einen Anwendungsfall geben, in dem es sehr praktisch ist: Wenn ich ein 2-D-Array von Floats habe, meine Berechnung jedoch für einen Teil dieses 2-D-Arrays keinen aussagekräftigen Wert hat, Ich werde diesen Wert mit "NaN" füllen. Dies kann verwendet werden, um nachgeschalteten Benutzern meiner Berechnung zu signalisieren (z. B. wenn sie in ein Rasterbild umgewandelt wird), "achten Sie an dieser Stelle nicht auf den Wert". Sehr hilfreich!
Dan H
Übrigens, was genau bedeutet es, ein Doppel zu "schrumpfen"? Neugierig ...
"NaN" steht für "keine Zahl". "Nan" wird erzeugt, wenn eine Gleitkommaoperation einige Eingabeparameter hat, die bewirken, dass die Operation ein undefiniertes Ergebnis erzeugt. Zum Beispiel ist 0.0 geteilt durch 0.0 arithmetisch undefiniert. Die Quadratwurzel einer negativen Zahl zu ziehen ist ebenfalls undefiniert.
Darüber hinaus wird NaN durch den IEEE-Standard für Gleitkomma-Arithmetik (IEEE 754) ganz explizit definiert, dem Java blind folgt. Das Lesen des Standards öffnet Ihnen die Augen für viele Dinge, wobei die mehreren Werte von Null eines der Dinge sind.
Esko
37
Hat NaNauch die interessante Eigenschaft, die einzige "Zahl" zu sein, die im Vergleich nicht mit sich selbst identisch ist. Daher ist ein gemeinsame (und in vielen Sprachen der einzige) Test , ob eine Zahl xist NaNdie folgende:boolean isNaN(x){return x != x;}
quazgar
3
Link als Antwort ist tot?
Pang
3
... "Die Quadratwurzel der negativen Zahl zu ziehen ist undefiniert (in der Arithmetik)" ... ist es nicht! Es ist tatsächlich iund einige Sprachen wie Python kommen sehr gut damit zurecht ... Es mag bei javadir nicht der Fall sein
Rafael T
5
@ RafaelT Ich würde sagen, es ist undefiniert in nicht komplexer Arithmetik. In Java gibt es keine Möglichkeit, einem Float oder Double eine komplexe Zahl zuzuweisen. Python ist dynamisch typisiert, daher kann es in diesem Fall möglich sein, nur eine komplexe Zahl zurückzugeben.
Sstn
19
NaNbedeutet „keine Zahl“ und ist im Grunde eine Darstellung eines speziellen Gleitkommawertes im Gleitkomma- Standard IEE 754 . NaN bedeutet im Allgemeinen, dass der Wert nicht mit einer gültigen Gleitkommazahl ausgedrückt werden kann.
Eine Konvertierung führt zu diesem Wert, wenn der zu konvertierende Wert etwas anderes ist, z. B. wenn eine Zeichenfolge konvertiert wird, die keine Zahl darstellt.
Konvertieren wie? Mit parseFloat()oder parseDouble? Oder etwas anderes?
Alonso del Arte
14
NaNbedeutet "keine Zahl" und ist das Ergebnis undefinierter Operationen an Gleitkommazahlen, wie zum Beispiel das Teilen von Null durch Null. (Beachten Sie, dass das Teilen einer Zahl ungleich Null durch Null in der Mathematik normalerweise ebenfalls undefiniert ist, jedoch nicht zu NaN, sondern zu einer positiven oder negativen Unendlichkeit führt.)
NaNbedeutet "keine Zahl." Es ist ein spezieller Gleitkommawert, der bedeutet, dass das Ergebnis einer Operation nicht als reelle Zahl definiert oder nicht darstellbar war.
Sehen Sie hier für weitere Erläuterung dieses Wertes.
Das erste, was Sie wissen müssen, ist, dass das Konzept von NaN direkt auf der CPU-Hardware implementiert ist.
Alle wichtigen modernen CPUs scheinen IEEE 754 zu folgen, das Gleitkommaformate spezifiziert, und NaNs, die nur spezielle Gleitkommawerte sind, sind Teil dieses Standards.
Daher ist das Konzept in jeder Sprache sehr ähnlich, einschließlich Java, das nur Gleitkomma-Code direkt an die CPU ausgibt.
Bevor Sie fortfahren, sollten Sie zunächst die folgenden Antworten lesen, die ich geschrieben habe:
Seltsame Operationen, die an der Grenze von plus oder minus unendlich liegen, ergeben jedoch + - unendlich anstelle von NaN
1.0f / 0.0f
log(0.0f)
0.0 fällt fast in diese Kategorie, aber wahrscheinlich ist das Problem, dass es entweder auf plus oder minus unendlich gehen könnte, so dass es als NaN belassen wurde.
Wenn NaN der Eingang einer Floating-Operation ist, ist der Ausgang tendenziell auch NaN
mehrere mögliche Werte für NaN gibt es 0x7fc00000, 0x7fc00001, 0x7fc00002, obwohl x86_64 scheint nur dann zu erzeugen 0x7fc00000.
NaN und unendlich haben eine ähnliche binäre Darstellung.
Kein Java-Typ, aber in JS und anderen Sprachen verwende ich "Not a Number", was bedeutet, dass eine Operation dazu führte, dass es keine gültige Nummer wurde.
Ich streite mit dieser Antwort. Erstens: "NaN" ist ein gültiger Wert für einen IEEE-Float! (Immerhin ist es in der Spezifikation definiert ... also ist es "gültig", oder?). Zweitens: "Division durch Null" kann durch IEEE "Positive Infinity" oder "Negative Infinity" dargestellt werden; Ein besseres Beispiel für "NaN" ist "Null geteilt durch Null", wie einige andere Antworten richtig gezeigt haben.
Dan H
"Gültiger Wert" und "in Spezifikation definiert" ist nicht dasselbe. Einverstanden mit 0/0.
Antworten:
Entnommen von dieser Seite :
quelle
NaN
auch die interessante Eigenschaft, die einzige "Zahl" zu sein, die im Vergleich nicht mit sich selbst identisch ist. Daher ist ein gemeinsame (und in vielen Sprachen der einzige) Test , ob eine Zahlx
istNaN
die folgende:boolean isNaN(x){return x != x;}
i
und einige Sprachen wie Python kommen sehr gut damit zurecht ... Es mag beijava
dir nicht der Fall seinNaN
bedeutet „keine Zahl“ und ist im Grunde eine Darstellung eines speziellen Gleitkommawertes im Gleitkomma- Standard IEE 754 . NaN bedeutet im Allgemeinen, dass der Wert nicht mit einer gültigen Gleitkommazahl ausgedrückt werden kann.Eine Konvertierung führt zu diesem Wert, wenn der zu konvertierende Wert etwas anderes ist, z. B. wenn eine Zeichenfolge konvertiert wird, die keine Zahl darstellt.
quelle
parseFloat()
oderparseDouble
? Oder etwas anderes?NaN
bedeutet "keine Zahl" und ist das Ergebnis undefinierter Operationen an Gleitkommazahlen, wie zum Beispiel das Teilen von Null durch Null. (Beachten Sie, dass das Teilen einer Zahl ungleich Null durch Null in der Mathematik normalerweise ebenfalls undefiniert ist, jedoch nicht zu NaN, sondern zu einer positiven oder negativen Unendlichkeit führt.)quelle
NaN
bedeutet "keine Zahl." Es ist ein spezieller Gleitkommawert, der bedeutet, dass das Ergebnis einer Operation nicht als reelle Zahl definiert oder nicht darstellbar war.Sehen Sie hier für weitere Erläuterung dieses Wertes.
quelle
NaN steht für Not a Number. Es wird verwendet, um jeden Wert zu kennzeichnen, der mathematisch undefiniert ist. Wie das Teilen von 0,0 durch 0,0. Weitere Informationen finden Sie hier: https://web.archive.org/web/20120819091816/http://www.concentric.net/~ttwang/tech/javafloat.htm
Veröffentlichen Sie Ihr Programm hier, wenn Sie weitere Hilfe benötigen.
quelle
NaN = keine Zahl.
quelle
Bedeutet keine Zahl. Es ist eine übliche Darstellung für einen unmöglichen numerischen Wert in vielen Programmiersprachen.
quelle
Minimal lauffähiges Beispiel
Das erste, was Sie wissen müssen, ist, dass das Konzept von NaN direkt auf der CPU-Hardware implementiert ist.
Alle wichtigen modernen CPUs scheinen IEEE 754 zu folgen, das Gleitkommaformate spezifiziert, und NaNs, die nur spezielle Gleitkommawerte sind, sind Teil dieses Standards.
Daher ist das Konzept in jeder Sprache sehr ähnlich, einschließlich Java, das nur Gleitkomma-Code direkt an die CPU ausgibt.
Bevor Sie fortfahren, sollten Sie zunächst die folgenden Antworten lesen, die ich geschrieben habe:
Nun zu einer Java-Aktion. Die meisten Funktionen von Interesse, die nicht in der Kernsprache enthalten sind, leben im Inneren
java.lang.Float
.Nan.java
GitHub stromaufwärts .
Laufen Sie mit:
Ausgabe:
Daraus lernen wir ein paar Dinge:
seltsame schwebende Operationen, die kein vernünftiges Ergebnis haben, geben NaN:
0.0f / 0.0f
sqrt(-1.0f)
log(-1.0f)
generieren a
NaN
.In C ist es tatsächlich möglich, Signale anzufordern, die bei solchen Operationen
feenableexcept
ausgelöst werden sollen, um sie zu erkennen, aber ich glaube nicht, dass sie in Java verfügbar sind: Warum ergibt die Ganzzahldivision durch Null 1/0 einen Fehler, aber einen Gleitkomma-Wert von 1/0 gibt "Inf" zurück?Seltsame Operationen, die an der Grenze von plus oder minus unendlich liegen, ergeben jedoch + - unendlich anstelle von NaN
1.0f / 0.0f
log(0.0f)
0.0
fällt fast in diese Kategorie, aber wahrscheinlich ist das Problem, dass es entweder auf plus oder minus unendlich gehen könnte, so dass es als NaN belassen wurde.Wenn NaN der Eingang einer Floating-Operation ist, ist der Ausgang tendenziell auch NaN
mehrere mögliche Werte für NaN gibt es
0x7fc00000
,0x7fc00001
,0x7fc00002
, obwohl x86_64 scheint nur dann zu erzeugen0x7fc00000
.NaN und unendlich haben eine ähnliche binäre Darstellung.
Lassen Sie uns einige davon aufschlüsseln:
Daraus bestätigen wir, was IEEE754 spezifiziert:
NaNs können entweder positiv oder negativ sein (oberes Bit), obwohl dies keinen Einfluss auf den normalen Betrieb hat
Getestet in Ubuntu 18.10 amd64, OpenJDK 1.8.0_191.
quelle
Kein Java-Typ, aber in JS und anderen Sprachen verwende ich "Not a Number", was bedeutet, dass eine Operation dazu führte, dass es keine gültige Nummer wurde.
quelle
Es bedeutet wörtlich "keine Zahl". Ich vermute, dass etwas mit Ihrem Konvertierungsprozess nicht stimmt.
Lesen Sie den Abschnitt Not A Number unter dieser Referenz
quelle
Kein gültiger Gleitkommawert (z. B. das Ergebnis der Division durch Null)
http://en.wikipedia.org/wiki/NaN
quelle