26 Stimmen

Algorithmus zur Umwandlung eines IEEE-754-Doppels in eine Zeichenkette?

Viele Programmiersprachen, die IEEE 754-Doubles verwenden, bieten eine Bibliotheksfunktion zur Konvertierung dieser Doubles in Strings. Zum Beispiel hat C sprintf hat C++ stringstream hat Java Double.toString , usw.

Wie werden diese Funktionen intern umgesetzt? Das heißt, welche(r) Algorithmus(e) verwenden sie, um das Double in eine Zeichenkettendarstellung umzuwandeln, da sie oft vom Programmierer gewählten Präzisionsbeschränkungen unterliegen?

Merci !

25voto

njuffa Punkte 20812

Der von verschiedenen Softwareumgebungen verwendete Code zur Umwandlung von Fließkommazahlen in Zeichenkettendarstellungen basiert in der Regel auf den folgenden Veröffentlichungen (besonders häufig wird die Arbeit von Steele und White zitiert):

Jerome T. Coonen: "An Implementation Guide to a Proposed Standard for Floating-Point Arithmetic". Computer Vol. 13, Nr. 1, Januar 1980, S. 68-79

Typ. L. Steele Jr. und J. L. White: "Wie man Gleitkommazahlen genau druckt". In Proceedings of ACM SIGPLAN '90 Konferenz über Entwurf und Implementierung von Programmiersprachen White Plains, New York, Juni 1990, S. 112-126

David M. Gay: "Korrekt gerundete binär-dezimale und dezimal-binäre Konvertierungen". Technischer Bericht 90-10, AT&T Bell Laboratories, November 1990.

Einige relevante Folgearbeiten:

Robert G. Burger und R. Kent Dybvig: "Schnelles und genaues Drucken von Gleitkommazahlen". In Proceedings of ACM SIGPLAN 1996 Konferenz über Entwurf und Implementierung von Programmiersprachen , Philadelphia, PA, USA, Mai 1996, S. 108-116

Guy L. Steele Jr. und Jon L. White: "Retrospektive: Wie man Fließkommazahlen genau druckt". ACM SIGPLAN-Bekanntmachungen Vol. 39, Nr. 4, April 2004, S. 372-389

Florian Loitsch: "Fließkommazahlen schnell und genau mit ganzen Zahlen drucken". In Proceedings of 2010 ACM SIGPLAN-Konferenz zum Entwurf und zur Implementierung von Programmiersprachen Toronto, ON, Kanada, Juni 2010, S. 233-243

Marc Andrysco, Ranjit Jhala, und Sorin Lerner: "Drucken von Fließkommazahlen: eine schnellere, immer korrekte Methode". ACM SIGPLAN-Bekanntmachungen Vol. 51, Nr. 1, Januar 2016, S. 555-567

Ulf Adams: "Ryu: schnelle Float-to-String-Konvertierung". ACM SIGPLAN-Bekanntmachungen , Vol. 53, No. 4, April 2018, pp. 270-282

16voto

Dan W Punkte 5648

Ich glaube, Sie suchen nach Schnelles und genaues Drucken von Fließkommazahlen

Ich habe diesen Link in einem anderen Beitrag gefunden: hier.

7voto

Mike T Punkte 37614

Siehe Ryan Juckett's Drucken von Fließkommazahlen (2014), in dem die Geschichte und die Implementierungen von Fließkomma-zu-String-Konvertierungen beschrieben werden. In diesem vierteiligen Beitrag stellt Ryan auch eine C++-Implementierung von Dragon4 auf der Grundlage von Steele und White (1990) ein effizienter Algorithmus zur Umwandlung einer Binärzahl im Fließkommaformat in eine Dezimalzahl im Stringformat.

Sie können auch eine C-Implementierung von Ryans Dragon4 für Numpy sehen aquí und verwenden Sie es in Python/Numpy 1.14 format_float_positional y format_float_scientific Funktionen.


Im Jahr 2018 wird ein Algorithmus/eine Bibliothek Ryu wurde veröffentlicht, mit Bindungen in vielen modernen Programmiersprachen (C, Java, C++, C#, Scala, Rust, Julia, Go, ...)

3voto

fvu Punkte 31678

Für die meisten Beispielsprachen, die Sie anführen, ist der Quelltext online frei einsehbar, da sie als Open Source verfügbar sind.

Für Java wird die Klasse java.lang.Double delegiert diese Arbeit an sun.misc.FloatingDecimal . Sehen Sie sich seinen Konstruktor und die Methode toJavaFormatString() an.

Für C ist die glibc immer ein gutes Beispiel, und dort haben wir siehe dass die Gleitkommaausgabe in einer eigenen Quelldatei steht.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X