相关疑难解决方法(0)

如何使用cout以完全精度打印双精度值?

所以我已经得到了我最后一个问题的答案(我不知道为什么我没有想到这一点).当我没想到它的时候,我正在打印一个圆润的double使用cout.如何使用全精度cout打印double

c++ floating-point precision iostream cout

308
推荐指数
9
解决办法
41万
查看次数

双面打印而不失精度

如何在流中打印双精度数,以便在读入时不会丢失精度?

我试过了:

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)

c++ floating-point iostream

32
推荐指数
5
解决办法
2万
查看次数

标签 统计

c++ ×2

floating-point ×2

iostream ×2

cout ×1

precision ×1