Umgang mit der FPU -Ausnahme unter Windows
Frage
Ich würde gerne mit der FPU -Ausnahme unter Windows umgehen, so etwas wie:
#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;
}
Aber unter Windows. Ich habe versucht, die MSDN zu lesen, aber das Dokument ist überhaupt nicht klar. Ich möchte dies mit Visual Studio -Compilern auf X86- und AMD64 -Bogen machen.
Ich bin nicht daran interessiert, die Ausnahme in C ++ zu übersetzen - eigentlich interessiere ich mich nicht einmal für die FPU -Ausnahme, nur daran, den FPU -Status nach einigen Berechnungen zu kennen, wie das obige Beispiel.
== edit ==
Ok, es sieht so aus, als wäre es tatsächlich viel einfacher: Die Verwendung von _clearfp ist genug:
#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;
}
Viel besser als mit Ausnahmen, SEH und anderen nicht tragbaren Sachen umzugehen :)
Lösung
Sie können _Statusfp2 () verwenden, um den Gleitkomma -Status abzurufen. Achten Sie darauf, dass 32-Bit sowohl FPU- als auch SSE-Anweisungen verwendet. Ein Beispielcode:
#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;
}
Andere Tipps
Wenn es sich um Visual Studio handelt, geben Sie diese Zeile ein:
#pragma float_control (except, on)
BEARBEITEN:
Wenn Sie dies in einfach C tun möchten, müssen Sie sich das ansehen Strukturierte Ausnahmebehandlung (Seh).
Diese Funktionen werden vom Standard vorgeschrieben, sodass Sie kein Problem beim Portieren haben sollten. Welchen genauen Fehler schlagen Sie?