¿Es posible asignar un NaNa a doubleo floaten 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.
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 ++.
O puede comparar el número consigo mismo: x == xdevuelve falsesif xes NaN.
Archie
7
@ Archie: No creo que eso esté garantizado en ninguno de los idiomas.
Mike Seymour
3
@MikeSeymour No según el estándar del lenguaje, pero hasta donde yo sé, debería funcionar si el compilador afirma ser compatible con IEEE.
Pixelchemist
37
@Pixelchemist: De hecho, es una opción si necesita ofuscación pero no portabilidad. Personalmente, prefiero la portabilidad sin ofuscación, así que no lo sugeriré yo mismo.
Mike Seymour
9
nota menor: NAN es un flotador, no un doble. enlace
orion elenzil
23
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.
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 truemediante su plataforma soporta IEEE 754estándar. Este hilo anterior explica que esto debería ser cierto para la mayoría de las situaciones.
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.
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 ostd::isnan()
desde<cmath>
en C ++.fuente
x == x
devuelvefalse
sifx
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:y fue simple descubrir lo que esto significa en este sitio, si revisa su sección
std::numeric_limits::has_quiet_NaN
que dice:el cual como se ha explicado aquí si
true
mediante su plataforma soportaIEEE 754
estándar. Este hilo anterior explica que esto debería ser cierto para la mayoría de las situaciones.fuente
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:
fuente
Sí, desde C99, (C ++ 11)
<math.h>
ofrece las siguientes funciones:que son como sus
strtod("NAN(n-char-sequence)",0)
homólogos yNAN
para asignaciones.Salida de muestra: (depende de la implementación)
fuente