繁体   English   中英

C++ 中浮点数的全精度显示?

[英]Full precision display of floating point numbers in C++?

我已经阅读了几个关于在 C++ 中显示浮点数的主题,但找不到令人满意的答案。

我的问题是:如何以科学格式(尾数/指数)在 C++ 中显示浮点数的所有有效数字?

问题是所有数字在基数 10 中的有效数字位数并不相同。

例如, double具有15 到 17 个有效十进制数字精度,但std::numeric_limits<double>::digits10返回 15,因此,对于某些数字,我将丢失 2 个额外的十进制数字精度。

std::numeric_limits<double>::digits10提供了可以安全恢复的十进制数字的数量,即在往返十进制-> double ->十进制中幸存下来的十进制数字的数量。 假设更多的十进制数字是正确的是没有帮助的。 如果你想促进往返double ->decimal-> double你会使用std::numeric_limits<double>::max_digits10

如果您想要确切的值,您可以使用std::numeric_limits<double>::digits但它会以一种有趣的方式显示从十进制值转换而来的数字,因为它们通常是四舍五入的值。 这也是max_digits10在显示供人类消费的数字时没有用的原因:最后几位数字通常不是人类读者所期望的。

你看过std::max_digits10吗?

cppreference

std::numeric_limits<T>::max_digits10是唯一表示T类型的所有不同值所需的基数为 10 的数字的数量,例如序列化/反序列化为文本所必需的。 此常量对所有浮点类型都有意义。

这意味着(以及我如何使用它)是文本输出可以复制/粘贴到另一个程序中,并且数字将代表相同的数字

现在,我必须说我的工作马格式总是右对齐的%23.16E ,我对最后几位使用工程判断。 我喜欢它,因为对于符号、指数和十六位数字就足够了。

-----------------------
-1.1234567812345678E+12

现在,请注意精度的digits和精度的decimal digits不一定是一回事。

在 C++20 中,您将能够使用std::format来执行此操作:

std::cout << std::format("{}", M_PI);

输出(假设 IEEE754 double ):

3.141592653589793

默认浮点格式是具有往返保证的最短十进制表示。 与使用std::numeric_limitsmax_digits10的精度相比,此方法的优势在于它不会打印不必要的数字。 例如:

std::cout << std::setprecision(
  std::numeric_limits<double>::max_digits10) << 0.3;

打印0.29999999999999999

std::cout << std::format("{}", 0.3);

打印0.3 ( Godbolt )。

同时,您可以使用{fmt} 库std::format基于。 {fmt} 还提供了print功能,使这更容易和更高效( Godbolt ):

fmt::print("{}", M_PI);

免责声明:我是 {fmt} 和 C++20 std::format

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM