阅读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中是否真的有这样的实现,甚至是标准还是以任何方式讨论过它?
答案 0 :(得分:3)
This是实际文章。博客文章指的是第7节中的结果(换句话说,“他们”并没有比较博客文章中的任何内容,“他们”正在反驳实际文章中的信息,省略了重要细节):
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年里实施它。或者只是重新考虑打印浮点数的性能是否真的是你的问题。