É possível atribuir NaN
a a double
ou float
em C / C ++? Como em JavaScript você faz: a = NaN
. Posteriormente, você poderá verificar se a variável é um número ou não.
É possível atribuir NaN
a a double
ou float
em C / C ++? Como em JavaScript você faz: a = NaN
. Posteriormente, você poderá verificar se a variável é um número ou não.
Respostas:
Em C, NAN
é declarado em <math.h>
.
Em C ++, std::numeric_limits<double>::quiet_NaN()
é declarado em <limits>
.
Mas para verificar se um valor é NaN, você não pode compará-lo com outro valor NaN. Em vez disso usar isnan()
a partir <math.h>
de C, ou std::isnan()
a partir <cmath>
de C ++.
x == x
retorna false
iff x
é NaN.
Como outros indicaram, você está procurando, std::numeric_limits<double>::quiet_NaN()
embora eu deva dizer que prefiro os documentos cppreference.com . Especialmente porque esta afirmação é um pouco vaga:
Significativo somente se std :: numeric_limits :: has_quiet_NaN == true.
e foi simples descobrir o que isso significa neste site, se você verificar a seção std::numeric_limits::has_quiet_NaN
que diz:
Esta constante é significativa para todos os tipos de ponto flutuante e é garantida como verdadeira se std :: numeric_limits :: is_iec559 == true.
que, como explicado aqui se true
meios a sua plataforma suporta IEEE 754
padrão. Este tópico anterior explica que isso deve ser verdade para a maioria das situações.
Isso pode ser feito usando numeric_limits em C ++:
http://www.cplusplus.com/reference/limits/numeric_limits/
Estes são os métodos que você provavelmente deseja examinar:
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.
É possível atribuir um NaN a um double ou float em C ...?
Sim, desde C99, (C ++ 11) <math.h>
oferece as funções abaixo:
#include <math.h>
double nan(const char *tagp);
float nanf(const char *tagp);
long double nanl(const char *tagp);
que são como suas strtod("NAN(n-char-sequence)",0)
contrapartes e NAN
para atribuições.
// 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);
Resultado da amostra: (dependente da implementação)
(7ff8000000012345)
(fff000000006789a)
(7ff8000000000000)