g++版本(5.4.0
(返回浮点数小于大约87的std::exp
的NaN
。
但是要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-38
。x
达到 -88
后,您会得到浮点异常,而结果6.0546e-39
小于 1e-38
。这不是NaN
,你用指令feenableexcept(FE_ALL_EXCEPT & ~FE_INEXACT)
调整了异常的引发。
如果删除位标志FE_UNDERFLOW
则循环将输出零(或小于非零值,具体取决于平台(。