如何抛出EXCEPTION_FLT_UNDERFLOW?

发布于 2024-09-27 04:04:10 字数 80 浏览 7 评论 0 原文

我需要一个示例代码,它会抛出 EXCEPTION_FLT_UNDERFLOW。我已经有代码来处理该异常。现在我需要样本,那就抛出它。有什么建议吗?

I need a sample code, that throws EXCEPTION_FLT_UNDERFLOW. I already have code to handle that exception. Now I need sample, that throws it. Any advises?

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

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

发布评论

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

评论(4

穿透光 2024-10-04 04:04:11

假设您想要触发此操作的实际代码:

#include <float.h>

int main()
{
    _controlfp_s(NULL, 0, _MCW_EM); // enable all floating point exceptions

    float f= 1.0f;

    while (f)
    {
        f/=2.0f;
        // __asm fwait; // optional, if you want to trap the underflow sooner
    }

    return 0;
}

Assuming you want actual code that will trigger this:

#include <float.h>

int main()
{
    _controlfp_s(NULL, 0, _MCW_EM); // enable all floating point exceptions

    float f= 1.0f;

    while (f)
    {
        f/=2.0f;
        // __asm fwait; // optional, if you want to trap the underflow sooner
    }

    return 0;
}
迷途知返 2024-10-04 04:04:11

尝试:

RaiseException(EXCEPTION_FLT_UNDERFLOW, EXCEPTION_NONCONTINUABLE, 0, NULL);

Try:

RaiseException(EXCEPTION_FLT_UNDERFLOW, EXCEPTION_NONCONTINUABLE, 0, NULL);
眼角的笑意。 2024-10-04 04:04:11

即使在 C99 中也没有可移植的方法来执行此操作。这适用于 Linux:

#define _GNU_SOURCE
#include <fenv.h>
int
main(void)
{
  fesetenv(FE_NOMASK_ENV);
  feraiseexcept(FE_UNDERFLOW);
  return 0;
} 

但如果没有 #define _GNU_SOURCEfesetenv 调用(不可移植),则不会抛出异常(= = 不会触发 SIGFPE(Unix 术语),它只是设置一个标志。并且 MSVC 的迭代均不支持 ,因此您在 Windows 上只能使用完全非标准的产品。

也就是说,似乎确实存在特定于 Windows 的等效项:

#include <float.h>
#pragma fenv_access (on)
int
main(void)
{
  _controlfp_s(0, 0, _MCW_EM); /* throw all floating point exceptions */
  /* trigger floating-point underflow here */
}

您必须使用实际的浮点运算来导致下溢情况。我不知道该怎么做。最好用汇编语言手动完成,以避免来自编译器的干扰(甚至更加不可移植,是的,但如果你使用 Windows,你可能不关心除 x86 之外的任何 CPU)。

Even in C99 there is no portable way to do this. This works on Linux:

#define _GNU_SOURCE
#include <fenv.h>
int
main(void)
{
  fesetenv(FE_NOMASK_ENV);
  feraiseexcept(FE_UNDERFLOW);
  return 0;
} 

but without the #define _GNU_SOURCE and the fesetenv call (which are not portable), the exception is not thrown (== does not trigger SIGFPE, in Unix terms), it just sets a flag. And no iteration of MSVC supports <fenv.h>, so you're stuck with completely nonstandard on Windows.

That said, there does appear to be a Windows-specific equivalent:

#include <float.h>
#pragma fenv_access (on)
int
main(void)
{
  _controlfp_s(0, 0, _MCW_EM); /* throw all floating point exceptions */
  /* trigger floating-point underflow here */
}

You will have to cause an underflow condition using actual floating point operations. I don't know how to do that off the top of my head. It would probably be best to do it by hand in assembly language, to avoid interference from the compiler (even more non-portability, yes, but if you're on Windows you probably don't care about any CPU but x86).

人事已非 2024-10-04 04:04:11

抛出异常_FLT_UNDERFLOW;

throw EXCEPTION_FLT_UNDERFLOW;

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