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 :)

War es hilfreich?

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)

Mehr dazu hier und hier.

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?

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top