c - Håndtering af fpu-undtagelse på vinduer

Indlæg af Hanne Mølgaard Plasc

Problem



Jeg vil gerne håndtere fpu-undtagelse på windows, noget som:


#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
");}
    if (raised & FE\_INVALID)  { printf("invalid
");}

    return 0;
}


Men på vinduer. Jeg forsøgte at læse MSDN, men dokumentet er slet ikke klart. Jeg vil gerne gøre dette med Visual Studio compilers, både på x86 og amd64 archs.


Jeg er ikke interesseret i at oversætte undtagelsen i C ++ - faktisk er jeg ikke engang interesseret i FPU-undtagelsen, kun ved at kende FPU-staten efter nogle beregninger, som eksemplet ovenfor.


== edit ==


Ok, det ser ud til, at det faktisk er meget enklere: at bruge \_clearfp er nok:


#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
");}

    return 0;
}


Meget bedre end at beskæftige sig med undtagelser, SEH og andre ikke-bærbare ting :)

Bedste reference


Du kan bruge \_statusfp2 () for at hente status for flydende punkt. Pas på, at 32-bit bruger både FPU og SSE instruktioner. Nogle prøvekode:


#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;
}

Andre referencer 1


Hvis det er Visual Studio, prøv at sætte denne linje:


#pragma   float\_control (except, on)


Mere om dette her og her. [5] [6]


EDIT:


Hvis du vil gøre dette i plain C, skal du se på den strukturerede undtagelseshåndtering ( SEH ). [7]

Andre referencer 2


Disse funktioner er mandat af standarden, så du bør ikke have noget problem ved porting. Hvilken nøjagtig fejl rammer du?