人。我正在做一些关于浮点运算的工作。 0.1是由二进制浮点格式表示的不精确。因此我写下了这个
float i = 0.1f;
并期待出现不准确的例外情况。我打开了-fp-trap-all = all选项,将fp-mode设置为strict并在我的代码中安装了SIGFPE信号处理程序。但什么都没发生。然后我试了
float i = 0.1f,j = 0.2f, c;
c = i + j;
仍然无法捕捉到任何异常!它让我疯狂。
很抱歉提到我最后在Linux上使用intel c ++编译器。
答案 0 :(得分:1)
您必须自己测试异常。以下代码works for me:
#include <stdio.h>
#include <fenv.h>
#ifndef FE_INEXACT
# error No FP Exception handling!
#endif
int main()
{
double a = 4.0;
a /= 3.0;
if (fetestexcept(FE_INEXACT) & FE_INEXACT)
{
printf("Exception occurred\n");
}
else
{
printf("No exception.\n");
}
}
如果您将4.0
替换为3.0
,则不会获得例外。
您可以使用double a = 0.0; a = sin(a);
执行类似操作。
仅有条件地支持陷阱例外。要检查,请使用文档中描述的宏:
#define _GNU_SOURCE
#include <fenv.h>
#ifndef FE_NOMASK_ENV
# warning Cannot raise FP exceptions!
#else
# warning Trapping FP exceptions enabled.
feenableexcept(FE_INEXACT);
#endif
答案 1 :(得分:0)
根据this answer,只有浮点数的舍入版本与数学上的精确数量不同时,才会引发不精确的异常。在您的情况下,舍入的响应是相同的,因此没有异常。