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.

¿Fue útil?

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.

  1. Esto requeriría que cada cálculo de flotación tenga esta comprobación. Un gran impacto en el rendimiento.
  2. NaN e Inf no son malvados. Pueden usarse legítimamente en alguna biblioteca que usa su aplicación, y romperla.
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top