Escribe una expresion matematica y obten el resultado al instante, con trigonometria en radianes o grados, logaritmos, factoriales, constantes y precedencia de operadores completa.
Escribe la expresion tal como lo harias en papel. El analizador gestiona parentesis anidados, menos unario, factoriales y llamadas a funciones con la precedencia correcta, de modo que 2 + 3 * 4 es 14 y -3^2 es -9, exactamente como exige la convencion matematica.
Leer 2 + 3 * 4 exige saber que la multiplicacion liga con mas fuerza que la suma, de modo que la respuesta es 14 y no 20. Cada operador lleva un nivel de precedencia y una asociatividad. La multiplicacion, la division y el operador de resto estan por encima de la suma y la resta; la exponenciacion esta por encima de todos ellos y es asociativa por la derecha, asi que 2^3^2 significa 2^(3^2) y da 512, no 64.
El menos unario es el caso sutil. La convencion matematica lo situa por debajo de la exponenciacion, y por eso -3^2 es -9: el exponente se aplica al 3 y la negacion se aplica al resultado. Las hojas de calculo discrepan celebremente y devuelven 9, asi que si alguna vez has visto dos herramientas dar respuestas distintas a la misma formula, esta suele ser la razon. Este evaluador sigue la convencion matematica.
Los parentesis anulan todo lo anterior y conviene usarlos con generosidad. Una expresion que necesita una tabla de precedencias para leerse es una expresion que tarde o temprano se leera mal.
Shunting-yard, en breve
La expresion se descompone primero en tokens - numeros, nombres, operadores y signos de puntuacion - y luego se reordena mediante el algoritmo shunting-yard de Dijkstra a forma postfija, donde los operadores siguen a sus operandos. 2 + 3 * 4 se convierte en 2 3 4 * +. La forma postfija no necesita parentesis ni reglas de precedencia, porque el orden de los tokens ya codifica la estructura, de modo que una simple maquina de pila puede evaluarla en una sola pasada.
El algoritmo mantiene dos estructuras: una lista de salida y una pila de operadores. Los numeros van directos a la salida; un operador primero desapila cualquier operador almacenado que ligue al menos con la misma fuerza antes de apilarse el mismo. Los parentesis actuan como marcas en la pila, y un parentesis de cierre desapila todo hasta su pareja. Las llamadas a funcion viajan como operadores con un contador de argumentos que aumenta cada vez que aparece una coma.
Es la misma tecnica que usan por dentro los motores de hojas de calculo y los planificadores de consultas. Se ejecuta en tiempo lineal, no necesita recursion e informa de una expresion mal formada de manera natural: si la pila no se vacia limpiamente al final, la entrada estaba desequilibrada.
Coma flotante, con honestidad
Los resultados se calculan en doble precision IEEE 754, la misma aritmetica que usan todos los navegadores y la mayoria de lenguajes de programacion. Almacena numeros en binario, y una fraccion decimal como 0,1 no tiene representacion binaria exacta, razon por la cual 0.1 + 0.2 produce el celebre 0.30000000000000004 en lugar de 0,3.
Redondear la presentacion a un numero fijo de digitos significativos oculta ese ruido sin cambiar el valor subyacente, que es lo que hace aqui el control de precision. Ponerlo en 12 mantiene la respuesta legible y deja margen de sobra antes de los 15 a 17 digitos que un doble puede distinguir realmente.
Conviene recordar dos limites. Los enteros solo son exactos hasta 2^53, asi que los factoriales y productos muy grandes se desvian; cualquier cosa por encima de 170! desborda directamente a infinito. Y restar dos numeros casi iguales destruye la precision - los digitos iniciales se cancelan y solo sobreviven los finales, que son ruido - asi que una formula reordenada para evitar esa resta suele ser mucho mas precisa que la version obvia.
Preguntas frecuentes
Por que -3^2 da -9 en lugar de 9?
La convencion matematica liga la exponenciacion con mas fuerza que el menos unario, asi que el cuadrado se aplica al 3 y la negacion despues. Escribe (-3)^2 si quieres 9, que es lo que asumen las hojas de calculo por defecto.
Por que 0.1 + 0.2 no es exactamente 0.3?
La coma flotante binaria no puede representar 0,1 con exactitud, asi que sobrevive un error diminuto a la suma. Redondear a 12 digitos significativos muestra 0,3 mientras el valor almacenado conserva toda su precision.
Como cambio la trigonometria a grados?
Pon la unidad angular en Grados. Entonces las entradas de sin, cos y tan se interpretan en grados, y asin, acos y atan devuelven grados, sin conversion manual de pi/180.
Que constantes estan disponibles?
pi, e, tau (2 pi), phi (la razon aurea) e inf para infinito. Los nombres no distinguen mayusculas, asi que PI y pi funcionan igual.
Puede calcular factoriales de numeros grandes?
Hasta 170!, el mayor factorial que cabe en un doble. Mas alla el resultado desborda a infinito. El factorial exige ademas un entero no negativo.
Se ejecuta la expresion mediante eval?
No. Se tokeniza y se convierte a postfijo con un analizador propio y luego se evalua en una pequena maquina de pila, asi que nada de lo que escribas se ejecuta jamas como JavaScript.