2011-01-20 9 views
10

Duplicar posibles:
Checking if a double (or float) is nan in C++Prueba si el valor del flotador es NaN

Tengo un requisito para comprobar si flotador es NaN. Al revisar algunos de los enlaces encontré el cheque más común.

FLOAT32 f32_test_NaN = (some_value); 
if (f32_test_NaN == f32_test_NaN) 
{ 
    //do something; 
} 
else 
{ 
    // do something; 
} 

Pero esto no parece funcionar para mí. Mi código es el siguiente:

FLOAT32 test_NaN = 0x414570A3;//some value - is this ok? 

depuración en GDB:

(gdb) p test_NaN 
$1 = 1.09506982e+09 

(gdb) p/x test_NaN 
$2 = 0x41457080 // Hex is not same as init value - What is compiler doing? 

Así que en mi caso es igual a test_NaNtest_NaN.

Háganme saber si se debe hacer alguna configuración del compilador. Estoy corriendo en solaris. O hay otra forma de verificar lo mismo.

Gracias de antemano.

+1

http://stackoverflow.com/questions/570669/checking-if-a-double-or-float-is-nan-in -c –

+3

¿Por qué no usar 'isnan()' de math.h? ¿Alguna razón especial? – Constantin

+0

Esa función estándar no está disponible en el entorno. – kp11

Respuesta

1

El problema es tal vez en su inicialización (al menos eso explica el valor que se ve en el BGF):

FLOAT32 test_NaN = 0x414570A3; 

El valor hexadecimal dado se considera como un número entero y se convierte en flotante (con exponente y valor) lo que significa que se almacena en un formato diferente.

Si desea forzar los bits dentro del flotador, entonces usted necesita para memcpy: (x = x)

FLOAT32 test_NaN; 
memcpy(&test_NaN, 0x414570A3, 4); 
+0

¡¡Genial !! Sabía que el problema estaba allí. Pero memcpy se estrelló para mí sin embargo. Por lo tanto, es justo lo que hizo y funcionó! UINT32 test_NaN [2] = {0xffffffff, 0xfffffff7}; FLOAT32 test = * (FLOAT32 *) test_NaN; (no muestra punteros en los comentarios (?!?)) – kp11

+2

Su código es incorrecto. memcpy debe copiar de la dirección. Así que primero almacene 0x414570A3 en una variable int. – Calmarius

22

Incluya math.h y use int isnan(x). No se olvide de enlazar con -lm

+1

Quizás debería agregarse que este "único" apareció en C99, por lo que no todos los compiladores podrían implementar esto todavía. –

+1

suncc lo admite, lo que parece ser lo que el que pregunta está utilizando. –

+0

En realidad 'isnan' no es una función, al menos cuando se usa después de incluir' math.h': es una macro con definición definida por la implementación. – Ruslan

6

Si <math.h> no está disponible, a continuación, hacer esto:

if (x != x) 
{ 
    // x is NaN 
} 
+0

Gracias, es lo mismo que estoy haciendo, pero probablemente no me esté inicializando correctamente. ¿Puede decirme con qué valor puedo inicializar 'x' para probar NaN? – kp11

+0

@kartik: 'x = 0.0; x/= x; ' –

6

si

Para x = 0x7FBFFFFF (bit de signo 0, a = 0, resto de los bits 1)

http://en.wikipedia.org/wiki/NaN

un ejemplo bit a bit de un IEEE de punto flotante de precisión simple estándar (32-b it) NaN: s111 1111 1axx xxxx xxxx xxxx xxxx xxxx donde s es el signo, x es la carga útil y a determina el tipo de NaN. Si a = 1, es un NaN silencioso; si a es cero y la carga útil es distinta de cero, se trata de una señalización NaN