2011-08-22 162 views
17

許多使用IEEE 754雙打的編程語言提供了一個庫函數來將這些雙精度轉換爲字符串。例如,C有sprintf,C++有stringstream,Java有Double.toString等。將IEEE 754 double轉換爲字符串的算法?

在內部,這些函數是如何實現的?也就是說,他們使用什麼算法將double轉換爲字符串表示,因爲它們通常受程序員選擇的精度限制?

謝謝!

回答

11

使用各種軟件環境中浮點數轉換爲字符串表示的代碼通常是基於以下出版物(由斯蒂爾和白色的工作特別頻繁引用):

傑羅姆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月

+4

2016年的另一篇新文章:Andrysco,Marc,Ranjit Jhala和Sorin Lerner。 「打印浮點數字:更快,總是正確的方法。」 ACM SIGPLAN通告51,no。 1(2016):555-567。 – sffc

2

對於大多數您引用源代碼的示例語言都可以在線自由地進行搜索,因爲它們都是開源的。

對於Java,類java.lang.Double代表這項工作sun.misc.FloatingDecimal。查看它的構造函數和JavaFormatString()方法。

對於C,glibc的始終是一個很好的例子,還有我們see浮點輸出位於其自己的源文件。

13

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

我發現了另一個帖子裏鏈接:here.

+1

一個很好的建議IMO,但(可惜)是很少的算法選擇頁面2010年ACM SIGPLAN會議紀要。這就是爲什麼0.2999999999999999999566等經常出現並導致很多混淆的原因。 – harold

相關問題