【问题标题】:Algorithm to convert an IEEE 754 double to a string?将 IEEE 754 双精度转换为字符串的算法?
【发布时间】:2011-11-01 12:15:01
【问题描述】:

许多使用 IEEE 754 双精度的编程语言都提供了一个库函数来将这些双精度转换为字符串。比如C有sprintf,C++有stringstream,Java有Double.toString,等等

在内部,这些功能是如何实现的?也就是说,考虑到它们经常受到程序员选择的精度限制,他们使用什么算法将双精度转换为字符串表示?

谢谢!

【问题讨论】:

    标签: string algorithm language-agnostic floating-point ieee-754


    【解决方案1】:

    请参阅 Ryan Juckett 的 Printing Floating-Point Numbers (2014),其中描述了浮点到字符串转换的历史和实现。在这篇由四部分组成的帖子中,Ryan 还提供了基于Steele and White (1990) 的 Dragon4 的 C++ 实现,这是一种将浮点格式的二进制数转换为字符串格式的十进制数的高效算法。

    您还可以看到 Ryan 的 Dragon4 用于 Numpy here 的 C 实现,并在 Python/Numpy 1.14 format_float_positionalformat_float_scientific 函数中使用它。


    2018 年,一个算法/库 Ryu 发布,绑定了许多现代编程语言(C、Java、C++、C#、Scala、Rust、Julia、Go 等)

    【讨论】:

      【解决方案2】:

      各种软件环境用于将浮点数转换为字符串表示的代码通常基于以下出版物(尤其经常引用 Steele 和 White 的工作):

      Jerome T. Coonen:“浮点算术拟议标准的实施指南”。 计算机,卷。 13,第 1 期,1980 年 1 月,第 68-79 页

      伙计。 L. Steele Jr. 和 J. L. White:“如何准确打印浮点数”。在ACM SIGPLAN '90 编程语言设计和实施会议上,White Plains,纽约,1990 年 6 月,第 112-126 页

      David M. Gay:“正确舍入的二进制-十进制和十进制-二进制转换。”技术报告 90-10,AT&T 贝尔实验室,1990 年 11 月。

      一些相关的后续工作:

      Robert G. Burger 和 R. Kent Dybvig:“快速准确地打印浮点数。”在ACM SIGPLAN 1996 编程语言设计和实现会议上,美国宾夕法尼亚州费城,1996 年 5 月,第 108-116 页

      Guy L. Steele Jr. 和 Jon L. White:“回顾:如何准确打印浮点数。” ACM SIGPLAN 通知,卷。 39,第 4 期,2004 年 4 月,第 372–389 页

      Florian Loitsch:“使用整数快速准确地打印浮点数。”在 2010 ACM SIGPLAN 编程语言设计和实施会议上,多伦多,安大略省,加拿大,2010 年 6 月,第 233-243 页

      Marc Andrysco、Ranjit Jhala 和 Sorin Lerner:“打印浮点数:一种更快、始终正确的方法。” ACM SIGPLAN 通知,卷。 51,第 1 期,2016 年 1 月,第 555-567 页

      Ulf Adams:“Ryū:快速浮点到字符串的转换。” ACM SIGPLAN 通知,卷。 53,第4期,2018年4月,第270-282页

      【讨论】:

      • 2016 年的另一篇新论文:Andrysco、Marc、Ranjit Jhala 和 Sorin Lerner。 “打印浮点数:一种更快、始终正确的方法。” ACM SIGPLAN 通知 51,第1 (2016): 555-567。
      • 2018 年出现了另一个突破,其性能是旧算法的 3 倍:Ulf Adams dl.acm.org/citation.cfm?id=3192369 的“Ryū:快速浮点到字符串转换”
      • 谢谢 srm 和 sffc,我已将这些最新出版物添加到答案中。
      • 如果有人有兴趣加入,我正在建立不同算法的基准。下午
      【解决方案3】:

      相信你在找Printing Floating-Point Numbers Quickly and Accurately

      我在另一个帖子中找到了该链接:here.

      【讨论】:

      • IMO 的一个很好的建议,但(遗憾的是)这很少是选择的算法。这就是为什么 0.2999999999999999999566 等经常出现并引起很多混乱的原因。
      【解决方案4】:

      对于您引用源代码的大多数示例语言,可以在线免费查阅,因为它们是开源的。

      对于 Java,java.lang.Double 类将这项工作委托给 sun.misc.FloatingDecimal。查看它的构造函数和 toJavaFormatString() 方法。

      对于 C,glibc 总是一个很好的例子,我们see 浮点输出位于它自己的源文件中。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-04
        • 1970-01-01
        • 1970-01-01
        • 2010-12-08
        • 2019-10-23
        相关资源
        最近更新 更多