59 puntos por GN⁺ 2025-02-17 | 12 comentarios | Compartir por WhatsApp

"¿Una app de calculadora? Cualquiera puede hacer una" → En realidad no

  • Una calculadora debe mostrar correctamente el resultado de una expresión matemática, y eso es mucho más difícil de lo que parece
  • En la calculadora de iOS, (10^100) + 1 − (10^100) se calcula incorrectamente como 0
  • Pero Android sí muestra correctamente 1, y la forma en que lo lograron es realmente increíble

Google y Hans-J. Boehm

  • Google contrató al famoso programador Hans-J. Boehm
  • Boehm es un experto que definió la semántica de variables compartidas en C++
  • Pero la tarea que le dieron fue inesperadamente desarrollar una app de calculadora

El problema del punto flotante

  • Los números de punto flotante no pueden representar con exactitud valores como 0.3 o 10^100
  • Es decir, una calculadora basada en punto flotante no es confiable
  • Para realizar cálculos exactos, se necesita otro enfoque

La solución con Bignum

  • El problema de los cálculos enteros puede resolverse usando Bignum (enteros de precisión arbitraria)
  • Bignum es un tipo entero que se expande dinámicamente según el tamaño de la memoria
  • El problema de (10^100) + 1 - (10^100) se resuelve usando Bignum
  • Pero las operaciones con fracciones siguen sin resolverse

Fracciones y números algebraicos

  • Las fracciones (valores como 3/4) pueden resolverse usando Bignum para guardar numerador y denominador
  • Sin embargo, no se pueden representar números irracionales como pi (π) o la raíz cuadrada (√2)
  • Boehm intentó una representación basada en polinomios
    • Ejemplo: √2 puede representarse con la ecuación x² - 2 = 0
    • Pero π no puede representarse ni siquiera con este método

Números reales constructivos (Constructive Real Numbers)

  • Boehm exploró el concepto de "Recursive Real Arithmetic (RRA)"
  • Si el usuario indica la precisión deseada, el valor se calcula dentro de ese margen
  • Ejemplo: si π se expresa con un error de 0.01, se devuelve 3.14
  • Pero este enfoque dificulta las comparaciones exactas

El problema de representar el cero exacto

  • Con el enfoque RRA, 1 - 1 podría representarse no como 0, sino como 0.0000000001
  • Esto genera problemas desde el punto de vista de la experiencia de usuario (UX)
  • Boehm empezó a buscar una solución en colaboración con otros investigadores

El algoritmo de Richardson-Fitch

  • En 1994, Dan Richardson y John Fitch resolvieron el problema de comparar números dentro de ciertas operaciones
  • Pero este algoritmo es tan lento que en la práctica no se puede usar
  • Por ejemplo, para determinar 1 ≠ 1 - e^(-e^1000) se requieren más operaciones que la cantidad de átomos en el universo

La combinación de RRA y aritmética racional

  • Boehm tuvo la idea de combinar las ventajas de RRA y la aritmética racional
  • Para operaciones simples (por ejemplo, 6 × 9 o 8 / 3) se usa aritmética racional
  • Solo se usa RRA cuando intervienen números irracionales
  • Como resultado, los números se representan en la forma de racional × real

Representación simbólica (Symbolic Representation)

  • Números especiales como π o √2 usan representación simbólica en lugar de RRA
  • Ejemplo: π se guarda como el símbolo "π" y solo se convierte a número cuando hace falta
  • No solo las cuatro operaciones básicas, también las funciones trigonométricas (sin, cos, tan), logaritmos y funciones exponenciales aprovechan la representación simbólica

La solución final

  • Todos los números se guardan como racional × real (representación simbólica o RRA)
  • Cuando es posible, se usa aritmética racional para mantener la exactitud
  • Se aprovecha al máximo la representación simbólica para minimizar las operaciones RRA
  • Como resultado, se completó un sistema de calculadora perfecto que equilibra velocidad y precisión

Conclusión

  • La calculadora de Android creada por Boehm y su equipo no es un programa simple
  • Aplica algoritmos rápidos y eficientes mientras ofrece resultados exactos
  • No es "solo una app de calculadora", sino un sistema matemáticamente sofisticado

"La próxima vez que uses la calculadora de Android, recuerda todo este esfuerzo."

12 comentarios

 
street62 2025-02-20

Como comentario aparte, me parece interesante que la IA neo lo haya traducido como "¿cualquiera puede hacerlo, no?". El original es "Anyone could make that", así que no tiene ese matiz juguetón, jaja, pero le queda perfecto.

 
gurugio 2025-02-19

Cuando era estudiante de pregrado, tuve una clase en la que hacíamos una placa 8086 soldándola a mano, conectábamos un teclado numérico y una LCD de texto, y hasta construíamos una calculadora (solo con las cuatro operaciones básicas) en ensamblador de 8086.
Hice la placa, conecté el teclado y la LCD, y logré que funcionara, pero no pude hacer la calculadora.
En ese entonces pensé que no tenía talento para el software, así que conseguí trabajo como ingeniero de hardware, pero por cosas de la vida terminé desarrollando software.
La calculadora de verdad era muy difícil.

 
yunsub2 2025-02-19

Es un error tipográfico: no es 거자나, sino 거잖아. 😃

 
carnoxen 2025-02-18

¿Ajustar el punto flotante? Te va a dar un dolor de cabeza, ¿no? jajajaja

 
tribela 2025-02-18

Cuando pienso en una calculadora, se me viene a la mente la calculadora predeterminada de Windows. Si calculas 2+2*2, da 8 en vez de 6. Parece que la hicieron así a propósito, pero no lo entiendo para nada. Recuerdo que una vez calculé la cantidad de alcohol en un cóctel y me salió más alcohol que el volumen total de la bebida, así que me dejó desconcertado.

 
khrad 2025-02-19

¿Una app de calculadora? Cualquiera puede hacerla, ¿no?

Sigue el funcionamiento típico de una calculadora electrónica común, donde cada vez que presionas un operador se calcula de inmediato la expresión anterior; ¿es que solo has usado calculadoras científicas?

 
ned0909 2025-02-18

Totalmente de acuerdo. Empecé con una calculadora porque me parecía genial que no necesitara servidor, pero terminé sufriendo muchísimo para corregir los errores de cálculo y los bugs que iban apareciendo.

 
aer0700 2025-02-17

"¿Una app de calculadora? Cualquiera puede hacer una" → en realidad no es así
Parece que esto tiene un montón de aplicaciones posibles jajaja

"¿Python? Está facilísimo" → en realidad no es así

 
tsboard 2025-02-17

Yo también pensé lo mismo al verlo. Jajaja

"¿JavaScript? Está facilísimo" → En realidad no

 
joyfui 2025-02-17

"(10^100)+1−(10^100)"
Oh, en serio, la calculadora del iPhone muestra 0 y la calculadora de Android muestra 1.
Pero curiosamente, si lo buscas en Google aparece 0...

 
GN⁺ 2025-02-17
Opiniones de Hacker News
  • Es una historia interesante. Una forma más potente de representar números es mediante fracciones continuas. Las fracciones continuas pueden representar números reales y racionales de manera eficiente
    • Como dato curioso, según libros de texto de matemáticas no tan antiguos, se consideraba muy probable que no existieran algoritmos de suma/multiplicación para fracciones continuas. Sin embargo, en 1972 Bill Gosper demostró que las fracciones continuas son perfectamente adecuadas para la aritmética
    • Estoy trabajando en una biblioteca de Python llamada reals. Está diseñada para reemplazar los tipos Decimal o Fraction. Usa las técnicas de Bill Gosper para manipular fracciones continuas
  • Es una lástima que el enlace se haya acortado y ya no se pueda hacer clic. Aquí está el enlace real al artículo
  • Me reí en cuanto leí el título. IEEE 754 es lo peor, pero sigue siendo mejor que cualquier otra cosa. En cuanto vi el ejemplo, pensé que sería Kahan summation o un sistema completo de álgebra computacional. Nunca había oído hablar de Recursive Real Arithmetic
    • Me dio una perspectiva sobre uno de los primeros héroes de C++. Me recordó lo profundos que pueden ser los problemas que parecen simples
  • La tarifa del metro de NYC es de $2.90. En iOS, al usar PCalc para calcular el saldo restante de una MetroCard, me apareció -8.881784197E-16 en lugar de 0. Esto no pasa cuando uso la calculadora de Apple
    • Le pregunté al desarrollador y me respondió que Apple usa su propia biblioteca matemática, y que tendría que buscar otra biblioteca para reemplazarla
  • Casi nadie ha hecho una app de calculadora realmente completa. Me refiero a una calculadora completa como la TI-89
    • Estoy usando un emulador de calculadora TI-89 en Android. No tiene ni la mitad de las funciones de la app de Android y además no funciona bien
  • La desventaja de cambiar a RRA no es solo la experiencia de usuario. Cuando el resultado es 0.0000000..., la calculadora no puede decidir si puede calcular el recíproco de ese número
    • Por ejemplo, 1/(atan(1/5)-atan(1/239)-pi/4) muestra "no se puede calcular". Si pruebas 1/(atan(1/5)-atan(1/239)-pi/4+10^(-100000)), igual muestra "no se puede calcular"
  • Casi ningún número puede representarse con punto flotante IEEE. La probabilidad de que un número aleatorio no pueda describirse teóricamente podría ser de casi 100%
    • Algunos problemas pueden evitarse usando bignums. Eso calma por un momento la angustia existencial
  • ¿Alguien sabe si las calculadoras TI avanzadas, como la TI-92, usaban este sistema? Tenían un modo de "racionales" y es posible que usaran RRA
  • La forma en que se usa "recursive real arithmetic" (RRA) me recordó una excelente conversación con Conal Elliot. Hablaba sobre pasar de representar las cosas de forma discreta a representarlas de forma continua
    • Por ejemplo, antes las fuentes se representaban como bloques de píxeles, pero ahora se entienden como líneas/vectores. La informática no debería tratar solo de aprender las herramientas comerciales más recientes, sino de buscar la verdad
  • Jugué un poco con el código fuente de la calculadora del Android Open Source Project. Google lo movió a Google Play Services, pero el código antiguo sigue disponible
    • Resuelve algunos problemas reales, y ojalá pueda usarse desde una biblioteca. En un artículo anterior hubo una discusión sobre algunas bibliotecas