我需要一个示例代码,它抛出EXCEPTION_FLT_UNDERFLOW。我已经有了处理该异常的代码。现在我需要样本,这就抛出了它。有什么建议吗?
发布于 2010-10-12 06:04:16
假设您想要触发此操作的实际代码:
#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-12 02:19:49
尝试:
RaiseException(EXCEPTION_FLT_UNDERFLOW, EXCEPTION_NONCONTINUABLE, 0, NULL);发布于 2010-10-12 02:39:48
即使在C99中,也没有可移植的方法来做到这一点。这在Linux上有效:
#define _GNU_SOURCE
#include <fenv.h>
int
main(void)
{
fesetenv(FE_NOMASK_ENV);
feraiseexcept(FE_UNDERFLOW);
return 0;
} 但是如果没有#define _GNU_SOURCE和fesetenv调用(它们是不可移植的),就不会抛出异常(在Unix术语中,==不会触发SIGFPE ),它只是设置一个标志。而且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 )。
https://stackoverflow.com/questions/3908851
复制相似问题