处理 Windows 上的 fpu 异常

发布于 2024-07-14 04:26:08 字数 960 浏览 7 评论 0原文

我想处理 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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(3

沙与沫 2024-07-21 04:26:08

您可以使用 _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;
}

You can use _statusfp2() to retrieve the floating point status. Beware that 32-bit uses both FPU and SSE instructions. Some sample code:

#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;
}
黯然#的苍凉 2024-07-21 04:26:08

如果是 Visual Studio,请尝试放入以下行:

#pragma   float_control (except, on)

有关此的更多信息 此处此处

编辑:

如果您想用纯 C 语言执行此操作,则需要查看 结构化异常处理 (SEH)。

If it's Visual Studio, try putting in this line:

#pragma   float_control (except, on)

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).

夜唯美灬不弃 2024-07-21 04:26:08

这些功能是标准强制要求的,因此移植应该没有问题。 你到底遇到了什么错误?

These functions are mandated by the standard, so you should have no problem in porting. What exact error are you hitting?

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文