题
我想处理窗户上的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状态,例如上面的示例。
==编辑==
好的,看起来它实际上更简单:使用_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;
}
比处理异常,SEH和其他非便携式内容要好得多:)
解决方案
您可以使用_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;
}
其他提示
这些功能由标准规定,因此您的移植物应该没有问题。您遇到什么确切的错误?
不隶属于 StackOverflow