¿Es posible asignar un NaN
a a double
o float
en C / C ++? Al igual que en JavaScript que hace: a = NaN
. Entonces, más tarde, puede verificar si la variable es un número o no.
¿Es posible asignar un NaN
a a double
o float
en C / C ++? Al igual que en JavaScript que hace: a = NaN
. Entonces, más tarde, puede verificar si la variable es un número o no.
Respuestas:
En C, NAN
se declara en <math.h>
.
En C ++, std::numeric_limits<double>::quiet_NaN()
se declara en <limits>
.
Pero para verificar si un valor es NaN, no puede compararlo con otro valor de NaN. En su lugar, utilice isnan()
desde <math.h>
en C o std::isnan()
desde <cmath>
en C ++.
x == x
devuelve false
sif x
es NaN.
Como otros han señalado, está buscando, std::numeric_limits<double>::quiet_NaN()
aunque debo decir que prefiero los documentos de cppreference.com . Especialmente porque esta declaración es un poco vaga:
Solo tiene sentido si std :: numeric_limits :: has_quiet_NaN == true.
y fue simple descubrir lo que esto significa en este sitio, si revisa su sección std::numeric_limits::has_quiet_NaN
que dice:
Esta constante es significativa para todos los tipos de punto flotante y se garantiza que sea verdadera si std :: numeric_limits :: is_iec559 == true.
el cual como se ha explicado aquí si true
mediante su plataforma soporta IEEE 754
estándar. Este hilo anterior explica que esto debería ser cierto para la mayoría de las situaciones.
Esto se puede hacer usando numeric_limits en C ++:
http://www.cplusplus.com/reference/limits/numeric_limits/
Estos son los métodos que probablemente quiera ver:
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.
¿Es esto posible asignar un NaN a un doble o flotante en C ...?
Sí, desde C99, (C ++ 11) <math.h>
ofrece las siguientes funciones:
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
que son como sus strtod("NAN(n-char-sequence)",0)
homólogos y NAN
para asignaciones.
// 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);
Salida de muestra: (depende de la implementación)
(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)