Ist es möglich, a NaN
einem double
oder float
in 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.
Ist es möglich, a NaN
einem double
oder float
in 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.
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 oder std::isnan()
von <cmath>
in C ++.
x == x
gibt false
iff zurück, wenn x
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:
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_NaN
es 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 true
Ihre Plattform IEEE 754
Standard unterstützt . Dieser vorherige Thread erklärt, dass dies für die meisten Situationen zutreffen sollte.
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:
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.
Ist es möglich, einem Double ein NaN zuzuweisen oder in C ... zu schweben?
Ja, seit C99 bietet (C ++ 11) <math.h>
die folgenden Funktionen:
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
die wie ihre strtod("NAN(n-char-sequence)",0)
Gegenstücke und NAN
für Aufgaben sind.
// Sample C code
uint64_t u64;
double x;
x = nan("0x12345");
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = -strtod("NAN(6789A)",0);
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
x = NAN;
memcpy(&u64, &x, sizeof u64); printf("(%" PRIx64 ")\n", u64);
Beispielausgabe: (Implementierungsabhängig)
(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)