Pregunta

Tengo variables dobles (o flotantes) que pueden ser & "; vacío &"; como al no tener ningún valor válido. ¿Cómo puedo representar esta condición con los tipos incorporados float y double?

Una opción sería un contenedor que tenga un flotante y un booleano, pero eso no puede funcionar, ya que mis bibliotecas tienen contenedores que almacenan dobles y no objetos que se comportan como dobles. Otro estaría usando NaN (std :: numeric_limits). Pero no veo forma de verificar si una variable es NaN.

¿Cómo puedo resolver el problema de necesitar un " especial " ¿el valor flotante significa algo diferente al número?

¿Fue útil?

Solución

En Visual C ++, hay un _isnan(double) función que puede importar a través de float.h.

En C, hay una función isnan(double) que puede importar a través de math.h.

En C ++, hay una función isnan (doble) que puede importar a través de cmath.

Como otros han señalado, usar NaN's puede ser muy complicado. Son un caso especial que debe tratarse como punteros NULL. La diferencia es que un NaN generalmente no causará volcados de núcleo y fallas en las aplicaciones, pero son extremadamente difíciles de rastrear. Si decides usar NaN's, úsalos lo menos posible. El uso excesivo de NaN's es una práctica de codificación ofensiva.

Otros consejos

Lo hemos hecho usando NaN:

double d = std::numeric_limits<double>::signaling_NaN();
bool isNaN = (d != d);

Los valores de NaN comparados para la igualdad contra sí mismos producirán falso. Esa es la forma en que se prueba el NaN, pero parece ser solo válido si std::numeric_limits<double>::is_iec559 es verdadero (si es así, también se ajusta a ieee754).

En C99 hay una macro llamada isnan para esto en math.h, que también comprueba un número de coma flotante para un valor NaN.

No es un tipo incorporado, pero generalmente uso boost::optional para este tipo de cosas. Si absolutamente no puede usar eso, tal vez un puntero haría el truco: si el puntero es NULL, entonces sabrá que el resultado no contiene un valor válido.

Una opción sería un contenedor que tiene un flotante y un booleano, pero que no puede & # 180; no funciona, ya que mis bibliotecas tienen contenedores que almacenan dobles y no objetos que se comportan como dobles .

Eso es una pena. En C ++ es trivial crear una clase con plantilla que se convierta automáticamente al atributo doble real (referencia). (O una referencia a cualquier otro tipo para el caso). Simplemente use el operador de conversión en una clase con plantilla. Por ejemplo: operador TYPE & Amp; () {valor de retorno; } Entonces puede usar un HasValue & Lt; double & Gt; en cualquier lugar donde normalmente usaría un doble.

Otro estaría usando NaN (std :: numeric_limits). Pero no veo forma de verificar si una variable es NaN.

Como litb y James Schek también comentaron, C99 nos proporciona isnan ().

¡Pero ten cuidado con eso! Los valores de Nan hacen que math & Amp; lógica muy interesante! Uno pensaría que un número no puede ser tanto NOT & Gt; = foo como NOT & Lt; = foo. Pero con NaN, puede.

Hay una razón por la que mantengo una macro WARN-IF-NAN (X) en mi caja de herramientas. He tenido algunos problemas interesantes en el pasado.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top