代码之家  ›  专栏  ›  技术社区  ›  Tobias Hermann

标准::exp(-100.0f)==NaN?

  •  1
  • Tobias Hermann  · 技术社区  · 7 年前

    g++版本( 5.4.0 )退货 NaN 对于 std::exp 浮点数大约小于87。

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

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

    这是标准库实现中的一个bug,还是我遗漏了什么?

    效果可能是 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 回复  |  直到 7 年前
        1
  •  5
  •   3CxEZiVlQ    7 年前

    您指定 FE_UNDERFLOW 早期浮点运算的结果低于正常值,精度降低 (的位标志之一 FE_ALL_EXCEPT )。最小值不等于零,可表示为 float 1e-38 。之后 x 达到 -88 ,则当结果为 6.0546e-39 这比 1e-38 。事实并非如此 NaN ,您使用指令调整了异常的引发 feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT)

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