我需要一个示例代码,它会抛出 EXCEPTION_FLT_UNDERFLOW。我已经有处理该异常的代码。现在我需要样本,它会抛出它。有什么建议吗?
问问题
1265 次
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_SOURCE
andfesetenv
调用(不可移植),不会抛出异常(== 不会触发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 回答