¿Una app de calculadora? Cualquiera puede hacer una, ¿no?
(chadnauseam.com)"¿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 como0 - 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.3o10^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:
√2puede representarse con la ecuaciónx² - 2 = 0 - Pero π no puede representarse ni siquiera con este método
- Ejemplo:
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 devuelve3.14 - Pero este enfoque dificulta las comparaciones exactas
El problema de representar el cero exacto
- Con el enfoque RRA,
1 - 1podría representarse no como0, sino como0.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 × 9o8 / 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
√2usan 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
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.
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.
Es un error tipográfico: no es
거자나, sino거잖아. 😃¿Ajustar el punto flotante? Te va a dar un dolor de cabeza, ¿no? jajajaja
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.
¿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?
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.
Resumen de la implementación en el código fuente
Explicación de la lógica de operaciones de la calculadora en el código fuente
Código de manejo de enteros
Código de manejo de números reales
"¿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í
Yo también pensé lo mismo al verlo. Jajaja
"¿JavaScript? Está facilísimo" → En realidad no
"(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...
Opiniones de Hacker News