2011-08-22 21 views
17

Muchos lenguajes de programación que usan dobles IEEE 754 proporcionan una función de biblioteca para convertir esos dobles en cadenas. Por ejemplo, C tiene sprintf, C++ tiene stringstream, Java tiene Double.toString, etc.Algoritmo para convertir un doble IEEE 754 en una cadena?

Internamente, ¿cómo se implementan estas funciones? Es decir, ¿qué algoritmo (s) están usando para convertir el doble en una representación de cadena, dado que a menudo están sujetos a las limitaciones de precisión elegidas por el programador?

Gracias!

Respuesta

11

El código utilizado por diversos entornos de software para convertir los números en coma flotante para representaciones de serie se basa normalmente en el siguiente publicaciones (el trabajo de Steele and White se cita particularmente con frecuencia):

Jerome T. Coonen. Una guía de implementación de un estándar propuesto para la aritmética de coma flotante. Computadora, vol. 13, No. 1, enero de 1980, pp. 68-79

Tipo. L. Steele Jr. y J. L. White. Cómo imprimir números de punto flotante con precisión. En Actas de la Conferencia ACM SIGPLAN '90 sobre Diseño e Implementación del Lenguaje de Programación, páginas 112-126, White Plains, Nueva York, junio de 1990.

David M. Gay. Conversiones binarias-decimales y decimales-binarias correctamente redondeadas. Informe Técnico 90--10, AT & T Bell Laboraties, noviembre de 1990.

Algunos trabajos de seguimiento relevante:

Robert G. hamburguesa y R. Kent Dybvig. Imprimir números de coma flotante de forma rápida y precisa. En Actas de la conferencia ACM SIGPLAN 1996 sobre el diseño e implementación del lenguaje de programación, páginas 108-116, Filadelfia, PA, EE. UU., Mayo de 1996

Guy L. Steele Jr. y Jon L. White. Retrospectiva: cómo imprimir números de punto flotante con precisión. Avisos de ACM SIGPLAN, Volumen 39, No. 4, páginas 372-389, abril de 2004

Florian Loitsch. Imprimir números de coma flotante de forma rápida y precisa con números enteros. En Actas de la conferencia 2010 de ACM SIGPLAN sobre diseño e implementación del lenguaje de programación, páginas 233-243, Toronto, ON, Canadá, junio de 2010

+4

Otro nuevo artículo en 2016: Andrysco, Marc, Ranjit Jhala y Sorin Lerner. "Imprimir números de coma flotante: un método más rápido y siempre correcto". Notificaciones de ACM SIGPLAN 51, no. 1 (2016): 555-567. – sffc

2

Para la mayoría de los idiomas de ejemplo que cita, la fuente es de consulta gratuita en línea, ya que están disponibles en código abierto.

Para Java, la clase java.lang.Double delega este trabajo en sun.misc.FloatingDecimal. Echa un vistazo a su constructor y al método JavaFormatString().

Para C, glibc es siempre un buen ejemplo, y allí tenemos see que la salida de coma flotante se encuentra en su propio archivo fuente.

Cuestiones relacionadas