문제
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 로이 작업을 수행하려면 구조화 된 예외 처리 (세).
이러한 기능은 표준에 의해 의무화되므로 포팅에 아무런 문제가 없어야합니다. 어떤 정확한 오류를 기록하고 있습니까?
제휴하지 않습니다 StackOverflow