Pregunta

Después de mirar otra pregunta sobre SO ( Uso de NaN en C ++ ) sentí curiosidad por std::numeric_limits<double>::signaling_NaN().

No pude obtener signaling_NaN para lanzar una excepción. Pensé que tal vez al señalar que realmente significaba una señal, intenté atrapar SIGFPE pero no ...

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 se evalúa como verdadero, por lo que se implementa en mi sistema.

¿Alguna idea?

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

¡Gracias!

¿Fue útil?

Solución

Puede usar la función _control87() para habilitar la función flotante excepciones puntuales. De la documentación de MSDN en signal():

  

Nota:

     

Las bibliotecas en tiempo de ejecución enmascaran todas las excepciones de punto flotante de forma predeterminada.

Cuando las excepciones de punto flotante están habilitadas, puede usar <=> o SEH (Manejo de excepciones estructuradas) para capturar ellos.

Otros consejos

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

He tenido que suceder en dos casos: imprimir desde un control de navegador integrado en una impresora HP, y registrar mi DLL (que establece algunos valores iniciales en NaN) desde InnoSetup, que está escrito en Delphi.

La clave está en numeric_limits<T>::has_signaling_NaN . ¿Qué valor tiene esto para ti? (¿El MSDN parece sugerir que siempre es false para MSVC?)

De TFM :

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

- >

  

La señalización NaN para tipo flotante es: 1. # QNAN

donde la 'Q' significa 'Quiet'. No sé por qué devolvería eso, pero es por eso que no arroja una excepción para usted.

Por curiosidad, ¿esto funciona mejor?

const double &real_snan( void )
{
    static const long long snan = 0x7ff0000080000001LL;
    return *(double*)&snan;
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top