26

¿Hay alguna forma de configurar Visual Studio (recién actualizado de 2008 a 2010) para romper, como si una aserción fallada, cada cualquier número de coma flotante se convierte en NaN, QNAN, INF, etc.Visual Studio C++ 2008/2010 - break on float NaN

Hasta ahora sólo he estado utilizando la aserción (x == x) truco, pero yo prefiero algo implícito, por lo que no tiene que añadir afirmaciones en todas partes.

me sorprendió bastante que no puedo encontrar una respuesta a esto a través de Google. Algunas cosas sobre 'excepciones de coma flotante', pero no estoy seguro si son lo mismo, y he intentado habilitarlas en Visual Studio, pero el programa no se rompe hasta que ocurre algo catastrófico debido al NaN más adelante. en ejecución.

Respuesta

30

1) Ir opción para proyectar y permitir /fp: estricta (C/C++ -> Generación de código -> flotante pinta de modelo).

2) Use _controlfp para establecer la palabra de control de coma flotante (vea el código a continuación).

#include <float.h> 
unsigned int fp_control_state = _controlfp(_EM_INEXACT, _MCW_EM); 

#include <math.h> 

int main() { 

    sqrtf(-1.0); // floating point exception 

    double x = 0.0; 
    double y = 1.0/x; // floating point exception 

    return 0; 
} 
+0

La mejor y más completa respuesta, aplausos. – Dave

+0

¿No sería _EM_INVALID? – ponce

+0

@ponce. Eso también funciona Podría ser mejor que _EM_INEXACT. – watson1180

0

No estoy seguro de si esto es posible, la forma que desee, pero puede crear una macro que envuelve el código en la línea marcada en una aserción o que establece un punto de interrupción para esto.

Esperanza esto ayuda

+0

No estoy seguro de lo que quiere decir con esto. Parece que quieres agregar afirmaciones afirmativas pero envolverlas en una macro? ¿Cómo ayuda eso? – Dave

1

Al menos en x86, cuando se genera un NaN etc, uno de los bits del registro de estado de la FPU se establece. Hay una manera que usted puede configurar para que tire un H/W excepción en la siguiente operación posteriorFP ocurre, pero eso no es del todo tan pronto como se esperaba. Sin embargo, no recuerdo la referencia.

+0

Tratando de encontrar una manera de hacer esto. Todo lo que puedo encontrar es la opción en Visual Studio en "Generación de código" para excepciones de coma flotante. Sin embargo, habilitar excepciones no tiene ningún efecto. Ver respuesta – Dave

+1

de watson1180 y esto: http://stackoverflow.com/questions/2769814/how-do-i-use-try-catch-to-catch-floating-point-errors/2769889#2769889 – George

4
+0

_clearfp bien, añadido y _controlfp comandos, así como la opción de menú de Visual Studio. Sin embargo, todavía no recibo excepciones, pero creo que este es un problema aparte ya que los valores son QNAN, lo que parece que no genera excepciones. Comenzaré una nueva pregunta relacionada con esto. – Dave