Flutuar ou dupla valor especial
-
22-07-2019 - |
Pergunta
Eu tenho variáveis ??duplas (ou float) que poderia ser "vazio", como na realização de nenhum valor válido. Como posso representar esta condição com o construído em tipos float e double?
Uma opção seria um invólucro que tem uma bóia e um booleano, mas que o trabalho can not, como meus bibliotecas têm recipientes que armazenam duplos e não objetos que se comportam como duplos. Outra estaria usando NaN (std :: numeric_limits). Mas não vejo nenhuma maneira de verificar se há uma variável sendo NaN.
Como posso resolver o problema de precisar de um valor float "especial" para significar algo diferente do que o número?
Solução
No Visual C ++, existe uma _isnan(double)
função não padronizado que você pode importar através float.h
.
Em C, há uma href="http://www.opengroup.org/onlinepubs/009695399/basedefs/math.h.html" rel="noreferrer"> isnan(double)
função que você pode importar através math.h
.
Em C ++, existe uma função isnan (duplo) que você pode importar através cmath
.
Como já foi apontado, usando NaN de pode ser um monte de problemas. Eles são um caso especial que tem de ser tratada com ponteiros NULL como. A diferença é que um NaN não irá geralmente causa core dumps e falhas de aplicação, mas eles são extremamente difíceis de rastrear. Se você decidir usar NaN de, usá-los o menos possível. O uso excessivo de NaN de uma prática de codificação ofensiva.
Outras dicas
Temos feito isso usando NaN:
double d = std::numeric_limits<double>::signaling_NaN();
bool isNaN = (d != d);
valores NaN comparação de igualdade contra si mesmo irá produzir falsos. Essa é a maneira como você testar a NaN, mas que parece ser válida apenas se std::numeric_limits<double>::is_iec559
é verdade (em caso afirmativo, está de acordo com IEEE754 também).
Em C99 há um macro chamado isnan
para isso em math.h
, que verifica um número de ponto flutuante para um valor NaN também.
É um built-in tipo, mas eu geralmente uso boost::optional
para este tipo de coisa. Se você absolutamente não pode usar isso, talvez um ponteiro faria o truque -. Se o ponteiro é NULL, então você sabe o resultado não contém um valor válido
Uma opção seria um invólucro que tem um anúncio flutuador um booleano, mas que o trabalho can not, como meus bibliotecas têm recipientes que armazenam duplos e não objetos que se comportam como duplos.
Isso é uma vergonha. Em C ++ é trivial para criar uma classe de modelo que auto-convertidos para o atributo real dupla (de referência). (Ou uma referência a qualquer outro tipo para esse assunto.) Você acabou de usar o operador de conversão em uma classe de modelo. Ex .: operador TYPE & () {valor de retorno; } Você pode então usar um HasValue
Outra estaria usando NaN (std :: numeric_limits). Mas não vejo nenhuma maneira de verificar se há uma variável sendo NaN.
Como litb e James Schek também comentou, C99 fornece-nos com isnan ().
Mas tenha cuidado com isso! valores Nan fazer matemática e lógica realmente interessante! Você acha que um número não poderia ser tanto NÃO> = foo e não <= foo. Mas com NaN, ele pode.
Há uma razão para eu continuar a-IF-NAN WARN (X) macro em minha caixa de ferramentas. Eu tive alguns problemas interessantes surgem no passado.