c++ debugging floating-point

Cómo rastrear un NaN en C++



debugging floating-point (4)

Algunas notas sobre la programación de punto flotante se pueden encontrar en http://ds9a.nl/fp/ incluyendo la diferencia entre 1/0 y 1.0 / 0, etc., y qué es un NaN y cómo actúa.

Voy a hacer algunos cálculos matemáticos usando C ++. El número de punto flotante de entrada es un número válido, pero después de los cálculos, el valor resultante es NaN. Me gustaría rastrear el punto donde aparece el valor de NaN (posiblemente utilizando GDB), en lugar de insertar una gran cantidad de isNan() en el código. Pero descubrí que incluso un código como este no activará una excepción cuando aparezca un valor de NaN.

double dirty = 0.0; double nanvalue = 0.0/dirty;

¿Podría alguien sugerir un método para rastrear el NaN o convertir un NaN en una excepción?


Como mencionó el uso de gdb, aquí hay una solución que funciona con gcc: desea que las funciones fenv.h definidas en fenv.h :

#include <fenv.h> #include <stdio.h> int main(int argc, char **argv) { double dirty = 0.0; feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT); // Enable all floating point exceptions but FE_INEXACT double nanval=0.0/dirty; printf("Succeeded! dirty=%lf, nanval=%lf/n",dirty,nanval); }

La ejecución del programa anterior produce la salida "Excepción de punto flotante". Sin el llamado a feenableexcept , el "¡ feenableexcept !" se imprime el mensaje.

Si SIGFPE que escribir un manejador de señales para SIGFPE , ese podría ser un buen lugar para establecer un punto de interrupción y obtener el rastreo que desea. (Descargo de responsabilidad: no lo he probado!)



Uno puede habilitar la llamada "señalización de NaN". Eso debería permitir que el depurador encuentre la posición correcta.

A través de google, encontré esto para habilitar los NaN de señalización en C ++, ni idea de si funciona:

std::numeric_limits::signaling_NaN();

¿Utilidad de la señalización de NaN?