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
答案 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
,您的循环将输出零(或小的非零值,具体取决于平台)。