Pergunta

Eu gostaria de lidar com a exceção da FPU no Windows, algo como:

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

Mas no Windows. Tentei ler o MSDN, mas o documento não está claro. Eu quero fazer isso com compiladores do Visual Studio, nos arcos x86 e amd64.

Não estou interessado em traduzir a exceção no C ++ - na verdade, nem estou interessado na exceção da FPU, apenas em conhecer o estado da FPU após algum cálculo, como o exemplo acima.

== edit ==

Ok, parece que é realmente muito mais simples: usar _clearfp é suficiente:

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

Muito melhor do que lidar com exceções, SEH e outras coisas não portáteis :)

Foi útil?

Solução

Você pode usar _statusfp2 () para recuperar o status do ponto flutuante. Cuidado com as instruções da FPU e SSE de 32 bits. Algum código de amostra:

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

Outras dicas

Se for o Visual Studio, tente colocar esta linha:

#pragma   float_control (except, on)

Mais sobre isso aqui e aqui.

EDITAR:

Se você quiser fazer isso na lisão C, precisará dar uma olhada no Manipulação de exceção estruturada (Seh).

Essas funções são obrigatórias pelo padrão, portanto, você não deve ter problemas na porção. Que erro exato você está acertando?

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top