将IEEE 754 double转换为字符串的算法?

问题描述 投票:19回答:4

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

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

谢谢!

string algorithm language-agnostic floating-point ieee-754
4个回答
16
投票

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

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

盖伊。 L. Steele Jr.和J. L. White:“如何准确地打印浮点数”。在ACM SIGPLAN '90计划语言设计与实施会议的论文集中,纽约怀特普莱恩斯,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 Notices,Vol。 39,第4期,2004年4月,第372-389页

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

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

Ulf Adams:“Ryū:快速浮动到字符串转换。” ACM SIGPLAN Notices,Vol。 2018年4月第53号,第4期,第270-282页


16
投票

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

我在另一篇文章中发现了这个链接:here.


3
投票

对于大多数示例语言,您引用的源代码可以在线自由查询,因为它们在开源中可用。

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

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


1
投票

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


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

© www.soinside.com 2019 - 2024. All rights reserved.