2011-08-22 20 views
17

Molti linguaggi di programmazione che utilizzano IEEE 754 doubles forniscono una funzione di libreria per convertire quei doppi in stringhe. Ad esempio, C ha sprintf, C++ ha stringstream, Java ha Double.toString, ecc.Algoritmo per convertire un IEEE 754 double in una stringa?

Internamente, come vengono implementate queste funzioni? Cioè, quale algoritmo (s) stanno usando per convertire il doppio in una rappresentazione di stringa, dato che sono spesso soggetti a limiti di precisione scelti dal programmatore?

Grazie!

risposta

11

Il codice utilizzato da vari ambienti software per convertire i numeri in virgola mobile a rappresentazioni di stringa è in genere basata sul seguente pubblicazioni (il lavoro di Steele e White è particolarmente frequente):

Jerome T. Coonen. Una guida all'implementazione di uno standard proposto per l'aritmetica a virgola mobile. Computer, vol. 13, No. 1, gennaio 1980, pp. 68-79

Guy. L. Steele Jr. e J. L. White. Come stampare con precisione i numeri in virgola mobile. In Atti della Conferenza ACM SIGPLAN '90 sulla programmazione e l'implementazione del linguaggio di programmazione, pagine 112-126, White Plains, New York, giugno 1990.

David M. Gay. Conversioni binario-decimale e decimale-binario correttamente arrotondate. Technical Report 90--10, AT & T Bell Laboraties, novembre 1990.

Alcuni rilevanti lavori followup:

Robert G. Burger e R. Kent Dybvig. Stampa di numeri in virgola mobile in modo rapido e preciso. In Atti della conferenza ACM SIGPLAN 1996 sulla programmazione e l'implementazione del linguaggio di programmazione, pagine 108-116, Philadelphia, PA, USA, maggio 1996

Guy L. Steele Jr. e Jon L. White. Retrospettiva: come stampare con precisione i numeri in virgola mobile. ACM SIGPLAN Avvisi, Volume 39, No. 4, pagine 372-389, aprile 2004

Florian Loitsch. Stampa di numeri in virgola mobile in modo rapido e accurato con numeri interi. In Atti della conferenza ACM SIGPLAN 2010 su Progettazione e implementazione del linguaggio di programmazione, pagine 233-243, Toronto, ON, Canada, giugno 2010

+4

Un altro nuovo articolo nel 2016: Andrysco, Marc, Ranjit Jhala e Sorin Lerner. "Stampa di numeri in virgola mobile: un metodo più veloce e sempre corretto." ACM SIGPLAN Avvisi 51, n. 1 (2016): 555-567. – sffc

2

Per la maggior parte delle lingue di esempio citate la fonte è liberamente consultabile online in quanto sono disponibili in open source.

Per Java, la classe java.lang.Double delega questo lavoro a sun.misc.FloatingDecimal. Controlla il suo costruttore e il metodo javaFormatString().

Per C, glibc è sempre un buon esempio e ci troviamo see che l'output in virgola mobile si trova nel proprio file sorgente.

13

credo siete alla ricerca di Printing Floating-Point Numbers Quickly and Accurately

ho scoperto che puntano su un altro post: here.

+1

Un buon suggerimento IMO, ma (purtroppo) questo è raramente l'algoritmo scelto. Questo è il motivo per cui 0.2999999999999999999566 e così regolarmente si presentano e causano molta confusione. – harold

Problemi correlati