Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/127.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++;将1添加到非常小的数字? 我只是在计算C++中的一个好的SigMID函数(和有效的)。所以我必须做一些类似的事情: 1/(1+exp(-x))_C++_Floating Point_Double_Precision - Fatal编程技术网

C++;将1添加到非常小的数字? 我只是在计算C++中的一个好的SigMID函数(和有效的)。所以我必须做一些类似的事情: 1/(1+exp(-x))

C++;将1添加到非常小的数字? 我只是在计算C++中的一个好的SigMID函数(和有效的)。所以我必须做一些类似的事情: 1/(1+exp(-x)),c++,floating-point,double,precision,C++,Floating Point,Double,Precision,问题是,当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 <ioman

问题是,当
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;
}
注意:就像人们在评论中指出的那样,部分输出是噪音(当时我没有考虑)。我主要是想证明你可以在
setprecision
中输入任意数字

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


这仍然存在用实际值保存double的问题。然而,这是可能的,并且维基百科有一个帮助这一点的库列表:。相关文章也有更多的解释。

您使用的是什么数据类型?显示您的代码以获得精确的答案。我的代码非常简单:
双四元数::sigmoidReal(double v){return 1.0/(1.0+exp(-v));}
好,所以它工作正常,但我无法使用标准精度看到它?^谢谢如果你真的想理解浮点运算,你至少应该从理解机器ε开始。在维基百科上查一下,一个双精度的机器ε为1.11e-16.Um,输出中的数字大部分是噪声。一旦超过15位数,你就会看到噪音。
1.000000000000093480778673438181
std::cout << 1 << "+" << exp(-30) << std::endl;
1+9.35762e-14