Ist es möglich, a NaNeinem doubleoder floatin C / C ++ zuzuweisen ? Wie in JavaScript tun Sie : a = NaN. So können Sie später überprüfen, ob die Variable eine Zahl oder keine ist.
In C ++ std::numeric_limits<double>::quiet_NaN()wird in deklariert <limits>.
Um zu überprüfen, ob ein Wert NaN ist, können Sie ihn nicht mit einem anderen NaN-Wert vergleichen. Verwenden Sie stattdessen isnan()von <math.h>in C oder std::isnan()von <cmath>in C ++.
Oder Sie können die Zahl mit sich selbst vergleichen - x == xgibt falseiff zurück, wenn xNaN ist.
Archie
7
@Archie: Ich denke nicht, dass das in beiden Sprachen garantiert ist.
Mike Seymour
3
@ MikeSeymour Nicht nach dem Sprachstandard, aber soweit ich weiß, sollte es funktionieren, wenn der Compiler behauptet, IEEE-konform zu sein.
Pixelchemist
37
@ Pixelchemist: In der Tat ist es eine Option, wenn Sie eine Verschleierung benötigen, aber keine Portabilität. Persönlich bevorzuge ich Portabilität ohne Verschleierung, daher werde ich es selbst nicht vorschlagen.
Mike Seymour
9
kleine Anmerkung: NAN ist ein Float, kein Double. Link
Orion Elenzil
23
Wie andere darauf hingewiesen haben, suchen Sie, std::numeric_limits<double>::quiet_NaN()obwohl ich sagen muss, dass ich die Dokumente von cppreference.com bevorzuge . Vor allem, weil diese Aussage etwas vage ist:
Nur sinnvoll, wenn std :: numeric_limits :: has_quiet_NaN == true ist.
und es war einfach herauszufinden, was dies auf dieser Site bedeutet, wenn Sie den Abschnitt lesen, in dem std::numeric_limits::has_quiet_NaNes heißt:
Diese Konstante ist für alle Gleitkommatypen von Bedeutung und ist garantiert wahr, wenn std :: numeric_limits :: is_iec559 == true ist.
Dies bedeutet, wie hier erläutert , dass trueIhre Plattform IEEE 754Standard unterstützt . Dieser vorherige Thread erklärt, dass dies für die meisten Situationen zutreffen sollte.
Dies sind die Methoden, die Sie wahrscheinlich betrachten möchten:
infinity() T Representation of positive infinity,if available.
quiet_NaN() T Representation of quiet (non-signaling)"Not-a-Number",if available.
signaling_NaN() T Representation of signaling "Not-a-Number",if available.
Antworten:
In C
NAN
wird in deklariert<math.h>
.In C ++
std::numeric_limits<double>::quiet_NaN()
wird in deklariert<limits>
.Um zu überprüfen, ob ein Wert NaN ist, können Sie ihn nicht mit einem anderen NaN-Wert vergleichen. Verwenden Sie stattdessen
isnan()
von<math.h>
in C oderstd::isnan()
von<cmath>
in C ++.quelle
x == x
gibtfalse
iff zurück, wennx
NaN ist.Wie andere darauf hingewiesen haben, suchen Sie,
std::numeric_limits<double>::quiet_NaN()
obwohl ich sagen muss, dass ich die Dokumente von cppreference.com bevorzuge . Vor allem, weil diese Aussage etwas vage ist:und es war einfach herauszufinden, was dies auf dieser Site bedeutet, wenn Sie den Abschnitt lesen, in dem
std::numeric_limits::has_quiet_NaN
es heißt:Dies bedeutet, wie hier erläutert , dass
true
Ihre PlattformIEEE 754
Standard unterstützt . Dieser vorherige Thread erklärt, dass dies für die meisten Situationen zutreffen sollte.quelle
Dies kann mit den numeric_limits in C ++ erfolgen:
http://www.cplusplus.com/reference/limits/numeric_limits/
Dies sind die Methoden, die Sie wahrscheinlich betrachten möchten:
quelle
Ja, seit C99 bietet (C ++ 11)
<math.h>
die folgenden Funktionen:die wie ihre
strtod("NAN(n-char-sequence)",0)
Gegenstücke undNAN
für Aufgaben sind.Beispielausgabe: (Implementierungsabhängig)
quelle