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

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

本文关键字:NaN -100 exp std 0f      更新时间:2023-10-16

g++版本(5.4.0(返回浮点数小于大约87的std::expNaN

但是要std::exp的文档建议,它接近0对于少量数字:

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

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

效果可以像这样重现:

#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 << "tt" << 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

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

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