Pregunta

Me gustaría manejar excepción FPU en las ventanas, algo como:

#include <math.h>
#include <fenv.h>
#include <stdio.h>

int main()
{
    double b = 0;
    int raised;
    feclearexcept (FE_ALL_EXCEPT);
    b /= 0;
    raised = fetestexcept (FE_OVERFLOW | FE_INVALID);
    if (raised & FE_OVERFLOW) { printf("over\n");}
    if (raised & FE_INVALID)  { printf("invalid\n");}

    return 0;
}

Sin embargo, en las ventanas. Traté de leer el MSDN, pero el documento no está claro en absoluto. Quiero hacer esto con los compiladores de Visual Studio, en ambos arcos de x86 y AMD64.

No estoy interesado en la traducción de la excepción en C ++ -. En realidad, ni siquiera estoy interesado en la excepción de FPU, sólo en conocer el estado FPU después de algún cálculo, como el ejemplo anterior

== == editar

Ok, parece que en realidad es mucho más simple: el uso de _clearfp es suficiente:

#include <math.h>
#include <float.h>
#include <stdio.h>

int main()
{
    double b = 0;
    int raised;
    raised = _clearfp();
    b /= 0;
    raised = _clearfp();
    if (raised & SW_INVALID)  { printf("invalid\n");}

    return 0;
}

Mucho mejor que tratar con excepciones, SEH y otras cosas no portátil:)

¿Fue útil?

Solución

Puede utilizar _statusfp2 () para recuperar el estado de coma flotante. Tenga en cuenta que de 32 bits utiliza ambas instrucciones FPU y SSE. Un código de ejemplo:

#include "stdafx.h"
#include <float.h>
#include <math.h>
#include <assert.h>


int _tmain(int argc, _TCHAR* argv[])
{
  unsigned x86;
  unsigned sse;
  // Test zero-divide
  double d = 0;
  double v = 1 / d;
  _statusfp2(&x86, &sse);
  assert(x86 & _EM_ZERODIVIDE);
  // Test overflow
  v = pow(10, 310.0);
  _statusfp2(&x86, &sse);
  assert(sse & _EM_OVERFLOW);
  return 0;
}

Otros consejos

Si se trata de Visual Studio, trate de poner en esta línea:

#pragma   float_control (except, on)

Más información este aquí y < a href = "http://msdn.microsoft.com/en-us/library/45ec64h6(VS.80).aspx" rel = "nofollow noreferrer"> aquí .

EDIT:

Si usted quiere hacer esto en C plano, que necesita para echar un vistazo a la control estructurado de excepciones ( SEH ).

Estas funciones están dispuesto por la norma, por lo que no debería tener problemas en la transferencia. Qué error exacto le pegas?

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top