所以我已经得到了我最后一个问题的答案(我不知道为什么我没有想到这一点).当我没想到它的时候,我正在打印一个圆润的double使用cout.如何使用全精度cout打印double?
如何在流中打印双精度数,以便在读入时不会丢失精度?
我试过了:
std::stringstream ss;
double v = 0.1 * 0.1;
ss << std::setprecision(std::numeric_limits<T>::digits10) << v << " ";
double u;
ss >> u;
std::cout << "precision " << ((u == v) ? "retained" : "lost") << std::endl;
Run Code Online (Sandbox Code Playgroud)
这不像我预期的那样有效.
但我可以提高精度(这让我感到惊讶,因为我认为数字10是所需的最大值).
ss << std::setprecision(std::numeric_limits<T>::digits10 + 2) << v << " ";
// ^^^^^^ +2
Run Code Online (Sandbox Code Playgroud)
它与有效位数有关,前两位不计入(0.01).
那么有人看过准确表示浮点数吗?我需要做的流上究竟是什么神奇的咒语?
经过一些实验:
问题在于我的原始版本.小数点后面的字符串中有无效数字会影响精度.
因此,为了弥补这一点,我们可以使用科学记数法来补偿:
ss << std::scientific
<< std::setprecision(std::numeric_limits<double>::digits10 + 1)
<< v;
Run Code Online (Sandbox Code Playgroud)
这仍然不能解释+1的必要性.
此外,如果我以更高的精度打印出数字,我会得到更高的精度!
std::cout << std::scientific << std::setprecision(std::numeric_limits<double>::digits10) << v << "\n";
std::cout << std::scientific …Run Code Online (Sandbox Code Playgroud)