C++ 将 1 加到非常小的数字?

C++ Adding 1 to very small number?

我只是想在 C++ 中计算一个好的 sigmoid 函数(并且高效)。所以我必须做类似的事情:
1/(1 + exp(-x))

问题是,当X变大(甚至变小)时,1 + e的结果变成0或1

例如,
1 + exp(-30) = 1
但这是不正确的...

我们如何轻松高效地添加非常小(或大)的数字?

数据类型 我正在使用:double

这是代码片段

double Quaternion::sigmoidReal(double v){
    return 1.0 / ( 1.0 + exp(-v) ) ; 
}

谢谢!

我认为你需要设置cout的精度:

#include <iostream>
#include <iomanip>

int main()
{
    std::cout << std::fixed;
    std::cout << std::setprecision(30);
    std::cout << (1 + exp(-30)) << std::endl;
    getchar();
    return 0;
}

输出:

1.000000000000093480778673438181

注意: 就像人们在评论中指出的那样,部分输出是噪音(当时我没有考虑)。我主要只是想证明您可以将任意数字放入 setprecision

这与1 double可以保存的最大信息量有关。部分位用于指数,部分用于实际数字。更 准确 的方法是像这样打印数字(不设置精度):

std::cout << 1 << "+" << exp(-30) << std::endl;

输出:

1+9.35762e-14

这仍然存在用该实际值保存双精度数的问题。然而,这是可能的,维基百科有一个图书馆列表可以帮助解决这个问题:Link。相关文章也有一些解释。