17 puntos por darjeeling 2026-01-25 | Aún no hay comentarios. | Compartir por WhatsApp

Resumen:

  • El nuevo algoritmo de conversión de punto flotante propuesto por Russ Cox es más simple y, al mismo tiempo, ofrece mejor rendimiento que algoritmos complejos existentes como Ryū y Dragonbox.
  • Gracias a una primitiva clave llamada Unrounded Scaling, acelera la conversión entre binario y decimal hasta el nivel de una sola multiplicación de 64 bits.
  • Se espera que esta implementación se incluya en Go 1.27 (previsto para agosto de 2026), y que admita tanto salida de precisión fija como parsing/salida de ancho mínimo.
  • Mejora de rendimiento frente a implementaciones existentes
  • Rendimiento de salida (Printing): mejora aproximada de 10 a 30%
  • Rendimiento de parsing (Parsing): mejora aproximada de 5 a 15%

Resumen detallado:

1. Contexto: la complejidad crónica de la conversión de punto flotante

Convertir el punto flotante binario de una computadora a un decimal legible por humanos, o hacer la conversión inversa, es un campo en el que durante décadas han competido numerosos algoritmos como Dragon4, Grisu3, Ryū y Dragonbox. En el pasado, Russ Cox decía que “la conversión es fácil, pero la velocidad es el problema”; sin embargo, en esta publicación demuestra que “un algoritmo de conversión rápida también puede ser simple”.

2. Idea central: Unrounded Numbers (⟨x⟩)

La base de este algoritmo es el tipo unrounded. Este conserva no solo la parte entera del número, sino también 2 bits de información adicional necesarios para el redondeo: el bit de ½ y el valor OR de los bits inferiores, conocido como sticky bit.

  • Estructura: ⟨x⟩ = ⌊4x⌋ | (4x ≠ ⌊4x⌋)
  • Ventaja: al mantener esta forma, se pueden ejecutar con muy bajo costo operaciones como floor, ceil o la más importante en punto flotante, Round-to-nearest, ties-to-even.

3. Escalado rápido sin redondeo (Fast Unrounded Scaling)

La función más importante es uscale(x, e, p). Esta calcula el resultado unrounded.
A diferencia de los algoritmos anteriores, que requerían operaciones con enteros muy grandes, este enfoque lo resuelve dentro de operaciones de 64 bits mediante el siguiente principio.

// Ejemplo de implementación conceptual (la versión optimizada real es más compleja)  
func uscale(x uint64, e, p int) unrounded {  
    // Calcula aproximando 10^p como 2^k * fracción exacta  
    // En la mayoría de los casos, se reduce a una sola multiplicación de 64 bits (mul64) y desplazamientos  
}  
  

4. Logros principales y rendimiento

  • Simplicidad: el código de implementación es muy corto, lo que facilita el mantenimiento y permite una demostración lógica.
  • Rendimiento: según los benchmarks, muestra un desempeño superior a Dragonbox (salida) y Eisel-Lemire (parsing), considerados hasta ahora entre los más rápidos.
  • Versatilidad: se aplica tanto a la salida en punto fijo (Fixed-width printing) como a la salida de ancho mínimo que recupera perfectamente el valor original (Shortest-width printing).

5. Qué significa para los desarrolladores

Este algoritmo está previsto para integrarse en la biblioteca estándar de Go. Los desarrolladores podrán obtener resultados correctos usando menos recursos de CPU cuando ocurran conversiones decimales internamente (por ejemplo, en fmt.Printf("%f", f) o strconv.ParseFloat). Además, ofrece inspiración para lograr un control numérico preciso mediante el concepto de unrounded, incluso sin recurrir a bibliotecas complejas de análisis numérico.```

Aún no hay comentarios.

Aún no hay comentarios.