El manejo de excepciones FPU en las ventanas
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:)
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?