我想要处理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 archs上使用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和其他不可移植的东西要好得多:)
发布于 2009-02-22 15:38:25
您可以使用_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;
}发布于 2009-02-22 13:07:09
如果是Visual Studio,试着放入下面这一行:
#pragma float_control (except, on)有关此here和here的更多信息。
编辑:
如果你想用普通的C实现这一点,你需要看一看structured exception handling ().
发布于 2009-02-22 12:58:25
这些函数是标准要求的,所以在移植时应该没有问题。您遇到的确切错误是什么?
https://stackoverflow.com/questions/574877
复制相似问题