-2

伙计们。我正在围绕浮点运算做一些工作。0.1 不精确地用二进制浮点格式表示。于是我写下了这个

float i = 0.1f;

并期望出现不确切的异常。我打开了 -fp-trap-all=all 选项,将 fp-mode 设置为严格并在我的代码中安装了 SIGFPE 信号处理程序。但是什么也没发生。然后我尝试了

float i = 0.1f,j = 0.2f, c;
c = i + j;

仍然无法捕获任何异常!它让我发疯。

很抱歉,我终于在 Linux 上使用了 intel c++ 编译器。

4

2 回答 2

1

您必须自己测试异常。以下代码适用于我

#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.03.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
于 2013-05-20T23:00:42.583 回答
0

根据这个答案,仅当浮点数的舍入版本与数学上精确的数量不同时才会引发不精确的异常。在您的情况下,四舍五入的响应是相同的,因此不会引发异常。

于 2013-05-20T22:41:33.857 回答