Question

Je voudrais gérer exception FPU sur les fenêtres, quelque chose comme:

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

Mais sur les fenêtres. J'ai essayé de lire le MSDN, mais le document n'est pas clair du tout. Je veux le faire avec les compilateurs Visual Studio, sur les deux x86 et archs amd64.

Je ne suis pas intéressé à traduire l'exception en C ++ -. En fait, je ne suis même pas intéressé à l'exception FPU, seulement connaître l'état FPU après certains calculs, comme dans l'exemple ci-dessus

== == modifier

Ok, on dirait qu'il est en fait beaucoup plus simple: en utilisant _clearfp suffit:

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

Beaucoup mieux que de traiter avec des exceptions, SEH et d'autres choses non portable:)

Était-ce utile?

La solution

Vous pouvez utiliser _statusfp2 () pour récupérer le statut de virgule flottante. Attention que 32 bits utilise les instructions FPU et SSE. Quelques exemples de code:

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

Autres conseils

Si c'est Visual Studio, essayez de mettre dans cette ligne:

#pragma   float_control (except, on)

En savoir plus sur cette et < a href = "http://msdn.microsoft.com/en-us/library/45ec64h6(VS.80).aspx" rel = "nofollow noreferrer"> ici .

EDIT:

Si vous voulez faire cela en C ordinaire, vous aurez besoin de jeter un oeil à la page gestion des exceptions structurées ( SEH ).

Ces fonctions sont mandatés par la norme, donc vous ne devriez avoir aucun problème dans le portage. Quelle est l'erreur exacte frappez-vous?

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top