提问者:小点点

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


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

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

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

例如,一个double有15到17个有效的十进制数字精度,但是std::numeric_limits


共3个答案

匿名用户

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

现在,请注意,精度的数字和精度的十进制数字不一定是一回事。