2008-10-25 17 views
7

Después de mirar otra pregunta en SO (Using NaN in C++) Me entró curiosidad por std::numeric_limits<double>::signaling_NaN().Cómo usar std :: signaling_nan?

No pude obtener signaling_NaN para lanzar una excepción. Pensé que tal vez mediante la señalización que realmente significaba una señal de lo que he intentado ponerse al SIGFPE pero nop ...

Aquí está mi código:

double my_nan = numeric_limits<double>::signaling_NaN(); 
my_nan++; 
my_nan += 5; 
my_nan = my_nan/10; 
my_nan = 15/my_nan; 
cout << my_nan << endl; 

numeric_limits<double>::has_signaling_NaN como resultado true, por lo que se implementa en mi sistema.

¿Alguna idea?

Estoy usando ms visual studio .net 2003 del compilador C++. Quiero probarlo en otro cuando llegue a casa.

Gracias!

+0

Supongo que my_nan y num se supone que son la misma variable. Si es así, arregla esto. – Motti

Respuesta

5

Puede usar la función _control87() para habilitar las excepciones de coma flotante. A partir de la documentación de MSDN en _control87():

Nota:

El tiempo de ejecución bibliotecas enmascaran todas las excepciones de punto flotante por defecto.

Cuando las excepciones de coma flotante están habilitadas, puede usar signal() o SEH (Structured Exception Handling) para atraparlas.

0

De TFM:

cout << "The signaling NaN for type float is: " 
    << numeric_limits<float>::signaling_NaN() 
    << endl; 

->

NAN de señalización de tipo float es: 1. # QNAN

donde la 'Q' es sinónimo de 'Silencio' . No sé por qué devolvería eso, pero es por eso que no lanza una excepción para ti.

Por curiosidad, ¿funciona mejor?

const double &real_snan(void) 
{ 
    static const long long snan = 0x7ff0000080000001LL; 
    return *(double*)&snan; 
} 
5

Una palabra de advertencia: El uso de DLL de terceros puede habilitar silenciosamente estas excepciones. Esto es especialmente cierto para cargar DLL que están escritos en un lenguaje que los habilita de manera predeterminada.

He tenido que suceder en dos casos: la impresión desde un control de navegador integrado a una impresora HP, y el registro de mi DLL (que establece algunos valores iniciales a NaN) de InnoSetup que está escrito en Delphi.

+1

Sé caso opuesto cuando llamar DLL externo los deshabilita. Entonces a partir de ese momento todas las excepciones de FPU quedan enmascaradas. Entonces no tengo ningún conocimiento sobre posibles errores en el programa. Esas cosas mal escritas son vergüenza. Todos los archivos DLL de terceros deben devolver máscaras de excepción de coma flotante a los valores anteriores. – truthseeker

Cuestiones relacionadas