[英]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_limits
中max_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.