我读过几个关于C中浮点数显示的主题,但我找不到令人满意的答案。
我的问题是:如何以科学格式(尾数/指数)在C中显示浮点数的所有有效数字?
问题是所有数字在10进制中的有效位数并不相同。
例如,一个double
有15到17个有效的十进制数字精度,但是std::numeric_limits
值std::numeric_limits
如果你想要精确的值,你可以使用std::numeric_limits
在C 20中,您将能够使用std::fomat
来执行此操作:
std::cout << std::format("{}", M_PI);
输出(假设IEEE754double
):
3.141592653589793
默认浮点格式是最短的十进制表示形式,具有往返保证。与使用std::
的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::fordat
是基于.{fmt}还提供了print
函数,使其更加简单和高效(godbolt):
fmt::print("{}", M_PI);
免责声明:我是{fmt}和C 20std::f的作者。
你看过std::max_digits10吗?
来自cp首选项:
std::numeric_limits
这意味着(也是我使用它的方式)可以将文本输出复制/粘贴到另一个程序中,并且数字将代表相同的数字。
现在,我必须说我的工作马格式总是右对齐的#.16E
,我对最后几位使用工程判断。我喜欢它,因为它足以用于符号、指数和十六位数字。
-----------------------
-1.1234567812345678E+12
现在,请注意,精度的数字
和精度的十进制数字
不一定是一回事。