문제

Windows에서 FPU 예외를 처리하고 싶습니다.

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

그러나 창문에서. MSDN을 읽으려고했지만 문서는 전혀 명확하지 않습니다. X86 및 AMD64 아치에서 Visual Studio 컴파일러 로이 작업을 수행하고 싶습니다.

C ++에서 예외를 번역하는 데 관심이 없습니다. 실제로, FPU 예외에도 관심이 없습니다. 위의 예와 같이 일부 계산 후 FPU 상태를 아는 경우에만 관심이 없습니다.

== edit ==

좋아요, 실제로 훨씬 간단한 것 같습니다. _clearfp를 사용하는 것이 충분합니다.

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

예외를 다루는 것보다 훨씬 낫다.

도움이 되었습니까?

해결책

_STATUSFP2 ()를 사용하여 부동 소수점 상태를 검색 할 수 있습니다. 32 비트는 FPU 및 SSE 지침을 모두 사용한다고 조심하십시오. 일부 샘플 코드 :

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

다른 팁

Visual Studio라면이 라인을 사용해보십시오.

#pragma   float_control (except, on)

이것에 대한 자세한 내용 여기 그리고 여기.

편집하다:

일반 C 로이 작업을 수행하려면 구조화 된 예외 처리 ().

이러한 기능은 표준에 의해 의무화되므로 포팅에 아무런 문제가 없어야합니다. 어떤 정확한 오류를 기록하고 있습니까?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top