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。相关文章也有一些解释。
我只是想在 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。相关文章也有一些解释。