Constante NaN C / C ++ (literal)?

É possível atribuir um NaN a um double ou float em C / C ++? Como no JavaScript você faz: a = NaN . Então, mais tarde, você pode verificar se a variável é um número ou não.

Em C, NAN é declarado em .

Em C ++, std::numeric_limits::quiet_NaN() é declarado em .

Mas para verificar se um valor é NaN, você não pode compará-lo com outro valor NaN. Em vez disso, use isnan() de em C, ou std::isnan() de em C ++.

Como outros apontaram, você está procurando por std::numeric_limits::quiet_NaN() embora eu tenha que dizer que prefiro os documentos cppreference.com . Especialmente porque esta afirmação é um pouco vaga:

Somente significativo se std :: numeric_limits :: has_quiet_NaN == true.

e era simples descobrir o que isso significa neste site, se você verificar sua seção em std::numeric_limits::has_quiet_NaN diz:

Essa constante é significativa para todos os tipos de ponto flutuante e é garantida como true se std :: numeric_limits :: is_iec559 == true.

que, conforme explicado aqui, se true significa que sua plataforma suporta o IEEE 754 . Este tópico anterior explica que isso deve ser verdade para a maioria das situações.

Isso pode ser feito usando os numeric_limits em C ++:

http://www.cplusplus.com/reference/limits/numeric_limits/

Estes são os methods que você provavelmente quer 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. 

Geralmente, não é uma boa ideia ter números inválidos no seu programa. Pode ser muito difícil se livrar deles mais tarde e eles podem causar falhas no seu programa.

Aqui está uma boa lista de maneiras de capturar esses números sem atribuí-los a eles: https://studiofreya.com/cpp/1-inf-1-ind-and-qnan-floating-point-numbers-and-errors/#Capturing -erros

Em suma, existem três deles:

  • comparação
  • usando o padrão c ++ 11
  • usando palavras de controle _controlfp e _control87