Tit*_*let 0 c++ floating-point precision double
我只是想在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) ) ; 
}
Run Code Online (Sandbox Code Playgroud)
谢谢 !
我认为你需要设置以下精度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;
}
Run Code Online (Sandbox Code Playgroud)
输出:
1.000000000000093480778673438181
Run Code Online (Sandbox Code Playgroud)
注意:就像人们在评论中注意到的那样,部分输出是噪音(当时我没有考虑过).我大多只是想证明你可以输入一个任意数字setprecision.
这与1个双倍可以保存的最大信息量有关.部分位用于指数,部分用于实际数字.更准确的方法是打印这样的数字(不设置精度):
std::cout << 1 << "+" << exp(-30) << std::endl;
Run Code Online (Sandbox Code Playgroud)
输出:
1+9.35762e-14
Run Code Online (Sandbox Code Playgroud)
这仍然存在使用该实际值保存double的问题.但是,它是可能的,并且维基百科有一个帮助这个的库列表:链接.相关文章也有一些解释.