Romper en NaNs o infs
-
05-07-2019 - |
Pregunta
A menudo es difícil encontrar el origen de un NaN, ya que puede ocurrir en cualquier paso de un cómputo y propagarse. Entonces, ¿es posible hacer que un programa C ++ se detenga cuando un cálculo devuelve NaN o inf? Lo mejor en mi opinión sería tener un fallo con un mensaje de error agradable:
Foo: NaN encoutered at Foo.c:624
¿Es algo como esto posible? ¿Tienes una mejor solución? ¿Cómo depuras los problemas de NaN?
EDIT: Precisiones: estoy trabajando con GCC en Linux.
Solución
No puede hacerlo de forma completamente portátil, pero muchas plataformas proporcionan API de C que le permiten acceder a los registros de control de estado de punto flotante.
Específicamente, desea desenmascarar las excepciones de punto flotante y de desbordamiento, lo que hará que el procesador señale una excepción cuando la aritmética en su programa produzca un resultado de NaN o infinito.
En tu sistema Linux, esto debería hacer el truco:
#include <fenv.h>
...
feenableexcept(FE_INVALID | FE_OVERFLOW);
Es posible que desee aprender a escribir un manejador de capturas para que pueda imprimir un mensaje de diagnóstico o continuar la ejecución cuando se señale una de estas excepciones.
Otros consejos
¡Sí! Configure (quizás más o menos portátil) su procesador compatible con IEEE 754 para generar una interrupción cuando se encuentre un NaN o infinito.
Busqué en Google y encontré estas diapositivas , que son un comienzo. La diapositiva en la página 5 resume toda la información que necesita.
No soy un experto en C, pero espero que la respuesta sea no.
- Esto requeriría que cada cálculo de flotación tenga esta comprobación. Un gran impacto en el rendimiento.
- NaN e Inf no son malvados. Pueden usarse legítimamente en alguna biblioteca que usa su aplicación, y romperla.