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?

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.

Não

É 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 em qualquer lugar que você normalmente usa um duplo.

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.

scroll top