È possibile assegnare NaNa a doubleo floatin C / C ++? Come in JavaScript che fate: a = NaN. Quindi più tardi puoi verificare se la variabile è un numero o no.
È possibile assegnare NaNa a doubleo floatin 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 == xrestituisce falsese xe 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_NaNesso 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 truesignifica che la vostra piattaforma supporta IEEE 754standard. 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 NANper 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)