standard regla online norme estándar string algorithm language-agnostic floating-point ieee-754

string - regla - Algoritmo para convertir un doble IEEE 754 en una cadena?



norme ieee 754 (4)

Consulte los números de punto flotante de impresión de Ryan Juckett (2014), que describen la historia y las implementaciones de conversiones de punto flotante a cadena. En esta publicación de cuatro partes, Ryan también proporciona una implementación en C ++ de Dragon4 basada en Steele y White (1990) , que es un algoritmo eficiente para convertir un número binario en formato de punto flotante a un número decimal en formato de cadena.

También puedes ver una implementación en C de Ryan''s Dragon4 para Numpy here , y usarla dentro de las funciones de format_float_scientific Python / Numpy 1.14 format_float_positional y format_float_scientific .

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.

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

¡Gracias!



El código utilizado por varios entornos de software para convertir números de punto flotante en representaciones de cadena se basa típicamente en las siguientes publicaciones (el trabajo de Steele y White se cita con mayor frecuencia):

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

Chico. L. Steele Jr. y JL White: "Cómo imprimir números de punto flotante con precisión". En las actas de la Conferencia ACM SIGPLAN ''90 sobre diseño e implementación del lenguaje de programación , White Plains, Nueva York, junio de 1990, págs. 112-126

David M. Gay: "Redondeado correctamente las conversiones binario-decimal y decimal-binario". Informe técnico 90-10, AT&T Bell Laboratories, noviembre de 1990.

Algunos trabajos de seguimiento relevantes:

Robert G. Burger y R. Kent Dybvig: "Imprimiendo números de punto flotante de forma rápida y precisa". En las actas de la conferencia ACM SIGPLAN 1996 sobre diseño e implementación del lenguaje de programación , Filadelfia, PA, EE. UU., Mayo de 1996, páginas 108-116

Guy L. Steele Jr. y Jon L. White: "Retrospectiva: cómo imprimir números de punto flotante con precisión". ACM SIGPLAN Avisos , vol. 39, No. 4, abril de 2004, pp. 372–389

Florian Loitsch: "Imprimiendo números de punto flotante de forma rápida y precisa con números enteros". En las actas de la Conferencia ACM SIGPLAN de 2010 sobre diseño e implementación de lenguajes de programación , Toronto, ON, Canadá, junio de 2010, págs. 233-243

Marc Andrysco, Ranjit Jhala y Sorin Lerner: "Impresión de números en coma flotante: un método más rápido y siempre correcto". ACM SIGPLAN Avisos , vol. 51, No. 1, enero de 2016, pp. 555-567

Ulf Adams: "Ryū: conversión rápida de flotación a cadena". ACM SIGPLAN Avisos , vol. 53, No. 4, abril de 2018, pp. 270-282


Para la mayoría de los idiomas de ejemplo, la fuente se puede consultar libremente en línea, ya que están disponibles en código abierto.

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

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