是否有标准的C方式打印浮点值;完美地;a拉龙4号?

是否有标准的C方式打印浮点值;完美地;a拉龙4号?,c,floating-point,floating-point-conversion,C,Floating Point,Floating Point Conversion,阅读时,我注意到他们将新算法与glibc的printf中使用的算法进行了比较: Grisu3的速度大约是GNULIBC中printf使用的算法的5倍 但与此同时,我没有找到任何能自动找到最佳小数位数的printf格式说明符。我尝试过的所有方法都有一些奇怪的默认值,比如%f的小数点后6位,或者%g的小数点后2位,或者%e的小数点后6位 我实际上如何使用本文中提到的glibc中的算法实现?glibc中真的有这样的实现吗?标准是否以任何方式讨论过它?没有“最佳小数位数”这样的东西,因为浮点数不存储为十

阅读时,我注意到他们将新算法与glibc的
printf
中使用的算法进行了比较:

Grisu3的速度大约是GNULIBC中printf使用的算法的5倍

但与此同时,我没有找到任何能自动找到最佳小数位数的
printf
格式说明符。我尝试过的所有方法都有一些奇怪的默认值,比如
%f
的小数点后6位,或者
%g
的小数点后2位,或者
%e
的小数点后6位

我实际上如何使用本文中提到的glibc中的算法实现?glibc中真的有这样的实现吗?标准是否以任何方式讨论过它?

没有“最佳小数位数”这样的东西,因为浮点数不存储为十进制数。所以你需要定义你所说的“最好”是什么意思。如果要在不丢失任何信息的情况下打印数字,C11将为您提供格式说明符
%a
(行为未指定的非规范化浮点数除外)

C11标准的默认值为6位,分别表示
%f
%e
,而
%g
则为:

让p等于 如果精度不为零,则精度为6;如果精度为零,则精度为1。 然后,如果样式为E的转换的指数为X: -如果P>X≥ −4、转换方式为f(或f)和精度 P− (X+1)。 -否则,将使用样式e(或e)和精度P进行转换− 一,

如果您想使用该算法,请为其实现您自己的函数。或者希望glibc在过去5年中已经实施了该计划。或者重新思考一下,打印浮点数的性能是否真的是一个问题。

才是真正的文章。这篇博文是指第7节中的结果(换句话说,“他们”不是在博文中比较任何东西,“他们”是从实际文章中重复信息,忽略了关键细节):


Dragon4或Grisu3的实现可以在现代编程语言的实现中找到,这些语言指定了这种“最小小数位数”的方式(我建议您避免称之为“完美”)。Java在某些上下文中使用这种类型的十进制转换,Ruby也是如此。C不是指定“最小小数位数”转换为十进制的语言之一,因此编译器或libc没有理由为Dragon4或Grisu3提供实现。

对Dragon4的引用已经定义了“最佳”的含义。也就是说,1)可以通过四舍五入从输出中恢复原始值2)输出尽可能短3)输出正确四舍五入。有关更多信息,请参阅。@Ruslan公开的“最佳”标准在某些上下文中是完全合理的,例如,如果这些数字将用于read-eval-print循环中。在我看来,对于任何想要支持这种REPL的语言来说,这都是必须的。@Ruslan我想我把它复制粘贴错了。否则,我通过Google“PDF GRISU LoiSch”找到它,尽管C没有这个功能,C++确实有它,因为C++ 17:没有格式参数的浮点类型函数生成最短表示(GCC支持)≥11、MSVC≥15.9).