std :: exp(-100.0f)== NaN?

时间:2018-03-24 16:41:06

标签: c++ gcc floating-point g++ nan

g ++版本(5.4.0)返回NaN std::exp,浮动小于大约87.

然而docs to std::exp 建议,对于小数字,它接近0

  

如果参数为-∞,则返回+0

这是标准库实现中的错误,还是我错过了什么?

效果可以是reproduced,如下所示:

#include <cmath>
#include <fenv.h>
#include <iostream>

int main()
{
    feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT);
    for (float x = 30; x > -1000; --x)
    {
        float y = std::exp(x);
        std::cout << x << "\t\t" << y << std::endl;
    }
}

输出:

30              1.06865e+13
29              3.93133e+12
28              1.44626e+12
27              5.32048e+11
...
-84             3.3057e-37
-85             1.2161e-37
-86             4.47378e-38
-87             1.64581e-38
Floating point exception

1 个答案:

答案 0 :(得分:4)

指定FE_UNDERFLOW 先前浮点运算的结果是低于正常且精度损失FE_ALL_EXCEPT的位标志之一)。 float可以表示的最小值不等于零是1e-38。在x到达-88后,您会得到浮点异常,而结果是6.0546e-39小于1e-38。它不是NaN,您使用指令feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT)调整了异常的加注。

如果删除位标志FE_UNDERFLOW,您的循环将输出零(或小的非零值,具体取决于平台)。