5

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

4

4 回答 4

4

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

#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;
}
于 2010-10-11T22:04:16.030 回答
2

尝试:

RaiseException(EXCEPTION_FLT_UNDERFLOW, EXCEPTION_NONCONTINUABLE, 0, NULL);
于 2010-10-11T18:19:49.113 回答
1

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

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

但是没有#define _GNU_SOURCEandfesetenv调用(不可移植),不会抛出异常(== 不会触发SIGFPE,在 Unix 术语中),它只是设置一个标志。并且没有 MSVC 的迭代支持<fenv.h>,所以你在 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)。

于 2010-10-11T18:39:47.860 回答
-2

抛出 EXCEPTION_FLT_UNDERFLOW;

于 2010-10-11T18:32:27.117 回答