首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >处理windows上的fpu异常

处理windows上的fpu异常
EN

Stack Overflow用户
提问于 2009-02-22 12:52:43
回答 3查看 2K关注 0票数 1

我想要处理windows上的fpu异常,例如:

代码语言:javascript
复制
#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就足够了:

代码语言:javascript
复制
#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和其他不可移植的东西要好得多:)

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2009-02-22 15:38:25

您可以使用_statusfp2()来检索浮点状态。请注意,32位同时使用FPU和SSE指令。一些示例代码:

代码语言:javascript
复制
#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;
}
票数 2
EN

Stack Overflow用户

发布于 2009-02-22 13:07:09

如果是Visual Studio,试着放入下面这一行:

代码语言:javascript
复制
#pragma   float_control (except, on)

有关此herehere的更多信息。

编辑:

如果你想用普通的C实现这一点,你需要看一看structured exception handling ().

票数 2
EN

Stack Overflow用户

发布于 2009-02-22 12:58:25

这些函数是标准要求的,所以在移植时应该没有问题。您遇到的确切错误是什么?

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/574877

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档