È possibile assegnare NaN
a a double
o float
in C / C ++? Come in JavaScript che fate: a = NaN
. Quindi più tardi puoi verificare se la variabile è un numero o no.
È possibile assegnare NaN
a a double
o float
in C / C ++? Come in JavaScript che fate: a = NaN
. Quindi più tardi puoi verificare se la variabile è un numero o no.
Risposte:
In C, NAN
è dichiarato in <math.h>
.
In C ++, std::numeric_limits<double>::quiet_NaN()
è dichiarato in <limits>
.
Ma per verificare se un valore è NaN, non è possibile confrontarlo con un altro valore NaN. Utilizzare invece isnan()
da <math.h>
in C o std::isnan()
da <cmath>
in C ++.
x == x
restituisce false
se x
e solo se è NaN.
Come altri hanno sottolineato che stai cercando std::numeric_limits<double>::quiet_NaN()
anche se devo dire che preferisco i documenti cppreference.com . Soprattutto perché questa affermazione è un po 'vaga:
Significativo solo se std :: numeric_limits :: has_quiet_NaN == true.
ed è stato semplice capire cosa significa su questo sito, se controlli la loro sezione su di std::numeric_limits::has_quiet_NaN
esso dice:
Questa costante è significativa per tutti i tipi a virgola mobile ed è garantita essere vera se std :: numeric_limits :: is_iec559 == true.
che, come spiegato qui se true
significa che la vostra piattaforma supporta IEEE 754
standard. Questo thread precedente spiega che questo dovrebbe essere vero per la maggior parte delle situazioni.
Questo può essere fatto usando numeric_limits in C ++:
http://www.cplusplus.com/reference/limits/numeric_limits/
Questi sono i metodi che probabilmente vorrai esaminare:
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.
È possibile assegnare un NaN a un double o un float in C ...?
Sì, poiché C99, (C ++ 11) <math.h>
offre le seguenti funzioni:
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
che sono come le loro strtod("NAN(n-char-sequence)",0)
controparti e NAN
per gli incarichi.
// 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);
Output di esempio: (dipendente dall'implementazione)
(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)