许多使用IEEE 754双打的编程语言提供了一个库函数来将这些双精度转换为字符串。例如,C有sprintf
,C++有stringstream
,Java有Double.toString
等。将IEEE 754 double转换为字符串的算法?
在内部,这些函数是如何实现的?也就是说,他们使用什么算法将double转换为字符串表示,因为它们通常受程序员选择的精度限制?
谢谢!
许多使用IEEE 754双打的编程语言提供了一个库函数来将这些双精度转换为字符串。例如,C有sprintf
,C++有stringstream
,Java有Double.toString
等。将IEEE 754 double转换为字符串的算法?
在内部,这些函数是如何实现的?也就是说,他们使用什么算法将double转换为字符串表示,因为它们通常受程序员选择的精度限制?
谢谢!
使用各种软件环境中浮点数转换为字符串表示的代码通常是基于以下出版物(由斯蒂尔和白色的工作特别频繁引用):
杰罗姆T. Coonen。拟议的浮点运算标准实施指南。 Computer,Vol。 1980年1月13号,第68-79页
盖伊。 L. Steele Jr.和J. L. White。如何准确打印浮点数。在对程序设计语言的设计与实现,112-126,怀特普莱恩斯,纽约页的ACM SIGPLAN '90会议论文集,1990年6月
大卫·M·盖伊。正确舍入二进制十进制和十进制二进制转换。技术报告90--10,AT & T贝尔Laboraties,1990年十一月
一些相关的后续工作:
罗伯特·伯格和肯特·代博维格。快速准确地打印浮点数。 在对编程语言设计与实现ACM SIGPLAN 1996年会议论文集,页108-116,费城,PA,USA,1996年5月
盖伊·史提尔二世小和Jon L.白色。回顾:如何准确打印浮点数。 ACM SIGPLAN声明,第39卷,第4号,372-389页,2004年4月
弗洛里安Loitsch。用整数快速准确地打印浮点数。在对程序设计语言的设计和实施,233-243,多伦多,加拿大,2010年6月
对于大多数您引用源代码的示例语言都可以在线自由地进行搜索,因为它们都是开源的。
对于Java,类java.lang.Double代表这项工作sun.misc.FloatingDecimal。查看它的构造函数和JavaFormatString()方法。
对于C,glibc的始终是一个很好的例子,还有我们see浮点输出位于其自己的源文件。
我相信你正在寻找Printing Floating-Point Numbers Quickly and Accurately
我发现了另一个帖子里链接:here.
一个很好的建议IMO,但(可惜)是很少的算法选择页面2010年ACM SIGPLAN会议纪要。这就是为什么0.2999999999999999999566等经常出现并导致很多混淆的原因。 – harold
2016年的另一篇新文章:Andrysco,Marc,Ranjit Jhala和Sorin Lerner。 “打印浮点数字:更快,总是正确的方法。” ACM SIGPLAN通告51,no。 1(2016):555-567。 – sffc