gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-27 22:40:26 25 4
gpt4 key购买 nike

g++ 版本 (5.4.0) 为 std::exp 返回 NaN, float 小于大约 87。

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

If the argument is -∞, +0 is returned

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

效果可以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

最佳答案

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

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

关于c++ - std::exp(-100.0f) == NaN?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49467244/

25 4 0