是否有标准的C方式来打印浮点值"完美" a la Dragon4?

时间:2015-06-03 10:12:02

标签: c floating-point floating-point-conversion

阅读Here be dragons: advances in problems you didn’t even know you had我注意到他们将新算法与glibc printf中使用的算法进行了比较:

  

Grisu3比GNU libc中printf使用的算法快约5倍

但与此同时,我未能找到printf的任何格式说明符,它会自动找到要打印的最佳小数位数。我尝试的所有内容都有一些奇怪的默认值,例如%f小数点后6位数或%g后点数或%e点后6位数。

如何在文章中提到的glibc中实际使用该算法实现?在glibc中是否真的有这样的实现,甚至是标准还是以任何方式讨论过它?

2 个答案:

答案 0 :(得分:3)

This是实际文章。博客文章指的是第7节中的结果(换句话说,“他们”并没有比较博客文章中的任何内容,“他们”正在反驳实际文章中的信息,省略了重要细节):

table of results with information

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

答案 1 :(得分:0)

没有“最佳小数位数”这样的东西,因为浮点数不会存储为十进制数。因此,您需要定义“最佳”的含义。如果要打印数字而没有任何可能的信息丢失,C11会为您提供格式说明符%a(未规范行为的非规范化浮点数除外)。

C11标准的默认值为%f%e的6位数,%g的默认值为:

  

让P等于   如果非零则为precision;如果省略精度则为6;如果精度为零,则为1。   然后,如果具有样式E的转换将具有指数X:    - 如果P> X≥-4,转换方式为f(或F)和精度   P - (X + 1)。    - 否则,转换采用样式e(或E)和精度P - 1。

如果要使用该算法,请为其实现自己的功能。或者希望glibc在过去的5年里实施它。或者只是重新考虑打印浮点数的性能是否真的是你的问题。