如何引发浮点异常

时间:2013-05-20 22:35:59

标签: c floating-point floating-point-exceptions

人。我正在做一些关于浮点运算的工作。 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 ++编译器。

2 个答案:

答案 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,只有浮点数的舍入版本与数学上的精确数量不同时,才会引发不精确的异常。在您的情况下,舍入的响应是相同的,因此没有异常。