处理 Windows 上的 fpu 异常
我想处理 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;
}
但是在 Windows 上。 我尝试阅读MSDN,但文档根本不清楚。 我想使用 Visual Studio 编译器在 x86 和 amd64 架构上执行此操作。
我对在 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 和其他不可移植的东西要好得多:)
I would like to handle fpu exception on windows, something like:
#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;
}
But on windows. I tried reading the MSDN, but the document is not clear at all. I want to do this with Visual Studio compilers, on both x86 and amd64 archs.
I am not interested in translating the exception in C++ - actually, I am not even interested in the FPU exception, only in knowing the FPU state after some computation, like the example above.
== edit ==
Ok, it looks like it is actually much simpler: using _clearfp is enough:
#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;
}
Much better than dealing with exceptions, SEH and other non portable stuff :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
您可以使用 _statusfp2() 检索浮点状态。 请注意,32 位同时使用 FPU 和 SSE 指令。 一些示例代码:
You can use _statusfp2() to retrieve the floating point status. Beware that 32-bit uses both FPU and SSE instructions. Some sample code:
如果是 Visual Studio,请尝试放入以下行:
有关此的更多信息 此处和此处。
编辑:
如果您想用纯 C 语言执行此操作,则需要查看 结构化异常处理 (SEH)。
If it's Visual Studio, try putting in this line:
More about this here and here.
EDIT:
If you want to do this in plain C, you'll need to take a look at the structured exception handling (SEH).
这些功能是标准强制要求的,因此移植应该没有问题。 你到底遇到了什么错误?
These functions are mandated by the standard, so you should have no problem in porting. What exact error are you hitting?