c++ visual-c++ floating-point nan

c++ - Cómo usar std:: signaling_nan?



visual-c++ floating-point (4)

Después de ver otra pregunta sobre SO ( usando NaN en C ++ ) comencé a std::numeric_limits<double>::signaling_NaN() curiosidad sobre std::numeric_limits<double>::signaling_NaN() .

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

¿Algunas ideas?

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

¡Gracias!


De TFM :

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

->

El NaN de señalización para el tipo flotación es: 1. # QNAN

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

Por curiosidad, ¿funciona esto mejor?

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


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

Nota:

Las bibliotecas de tiempo de ejecución enmascaran todas las excepciones de coma flotante de manera predeterminada.

Cuando las excepciones de punto flotante están habilitadas, puede usar signal() o SEH (Manejo estructurado de excepciones) para capturarlas.


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 instancias: imprimir desde un control de navegador incorporado a una impresora HP, y registrar mi DLL (que establece algunos valores iniciales en NaN) desde InnoSetup, que está escrito en Delphi.