首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何抛出EXCEPTION_FLT_UNDERFLOW?

如何抛出EXCEPTION_FLT_UNDERFLOW?
EN

Stack Overflow用户
提问于 2010-10-12 02:15:14
回答 4查看 1.2K关注 0票数 5

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

EN

回答 4

Stack Overflow用户

回答已采纳

发布于 2010-10-12 06:04:16

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

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

Stack Overflow用户

发布于 2010-10-12 02:19:49

尝试:

代码语言:javascript
复制
RaiseException(EXCEPTION_FLT_UNDERFLOW, EXCEPTION_NONCONTINUABLE, 0, NULL);
票数 2
EN

Stack Overflow用户

发布于 2010-10-12 02:39:48

即使在C99中,也没有可移植的方法来做到这一点。这在Linux上有效:

代码语言:javascript
复制
#define _GNU_SOURCE
#include <fenv.h>
int
main(void)
{
  fesetenv(FE_NOMASK_ENV);
  feraiseexcept(FE_UNDERFLOW);
  return 0;
} 

但是如果没有#define _GNU_SOURCEfesetenv调用(它们是不可移植的),就不会抛出异常(在Unix术语中,==不会触发SIGFPE ),它只是设置一个标志。而且MSVC的任何版本都不支持<fenv.h>,所以你只能在Windows上使用完全非标准的版本。

也就是说,似乎确实存在Windows特定的等价物:

代码语言:javascript
复制
#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 )。

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

https://stackoverflow.com/questions/3908851

复制
相关文章

相似问题

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