Domanda

Vorrei gestire eccezione FPU sulle finestre, qualcosa come:

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

Ma su Windows. Ho provato a leggere MSDN, ma il documento non è chiaro a tutti. Voglio fare questo con Studio compilatori visivi, su entrambe le arcate x86 e AMD64.

Io non sono interessato a tradurre l'eccezione in C ++ -. In realtà, io non sono nemmeno interessati ad eccezione FPU, solo nel conoscere lo stato FPU dopo qualche calcolo, come l'esempio di cui sopra

== Modifica ==

Ok, sembra che in realtà è molto più semplice: utilizzando _clearfp è sufficiente:

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

Molto meglio che fare con eccezioni, SEH e altre cose non portatile:)

È stato utile?

Soluzione

È possibile utilizzare _statusfp2 () per recuperare lo stato in virgola mobile. Attenzione che a 32-bit utilizza entrambe le istruzioni FPU e SSE. Alcuni esempi di codice:

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

Altri suggerimenti

Se è Visual Studio, prova a mettere in questa linea:

#pragma   float_control (except, on)

Ulteriori su questi qui e < a href = "http://msdn.microsoft.com/en-us/library/45ec64h6(VS.80).aspx" rel = "nofollow noreferrer"> qui .

Modifica

Se si vuole fare questo in C puro, avrete bisogno di dare uno sguardo al la gestione delle eccezioni strutturata ( SEH ).

Queste funzioni sono mandato dallo standard, così si dovrebbe avere alcun problema nel porting. Che errore esatto stai colpendo?

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top