Évaluateur mathématique

Saisissez une expression mathématique et obtenez le résultat instantanément, avec la trigonométrie en radians ou en degrés, les logarithmes, les factorielles, les constantes et la priorité complète des opérateurs.

Écrivez l'expression comme vous le feriez sur papier. L'analyseur gère les parenthèses imbriquées, le moins unaire, les factorielles et les appels de fonction avec la priorité correcte, si bien que 2 + 3 * 4 donne 14 et -3^2 donne -9, exactement comme l'exige la convention mathématique.

Syntaxe prise en charge

Opérateurs
+ - * / % ^ ! ( )
Constantes
pi e tau phi inf
Trigonométrie
sin cos tan asin acos atan sinh cosh tanh
Général
sqrt cbrt abs sign exp ln log log2 round floor ceil trunc
Multi-argument
min max hypot sum avg pow

Comment une expression devient un nombre

La priorité est tout le problème

Lire 2 + 3 * 4 exige de savoir que la multiplication lie plus fortement que l'addition, si bien que la réponse est 14 plutôt que 20. Chaque opérateur porte un niveau de priorité et une associativité. La multiplication, la division et l'opérateur de reste se placent au-dessus de l'addition et de la soustraction ; l'exponentiation se place au-dessus de tous et est associative à droite, si bien que 2^3^2 signifie 2^(3^2) et vaut 512, pas 64.

Le moins unaire est le cas subtil. La convention mathématique le place sous l'exponentiation, voilà pourquoi -3^2 vaut -9 : l'exposant s'applique à 3 et la négation s'applique au résultat. Les tableurs célèbres ne sont pas d'accord et renvoient 9, si bien que si vous avez déjà vu deux outils donner des réponses différentes à la même formule, c'est généralement pour cette raison. Cet évaluateur suit la convention mathématique.

Les parenthèses passent par-dessus tout, et elles valent la peine d'être utilisées librement. Une expression qui a besoin d'un tableau de priorité pour être lue est une expression qui finira par être mal lue.

Shunting-yard, en bref

L'expression est d'abord décomposée en jetons - nombres, noms, opérateurs et ponctuation - puis réordonnée par l'algorithme shunting-yard de Dijkstra sous forme postfixe, où les opérateurs suivent leurs opérandes. 2 + 3 * 4 devient 2 3 4 * +. Le postfixe n'a besoin ni de parenthèses ni de règles de priorité, car l'ordre des jetons encode déjà la structure, si bien qu'une simple machine à pile peut l'évaluer en un seul passage.

L'algorithme conserve deux structures : une liste de sortie et une pile d'opérateurs. Les nombres vont directement à la sortie ; un opérateur dépile d'abord tout opérateur empilé qui lie au moins aussi fortement avant d'être empilé lui-même. Les parenthèses agissent comme des marqueurs sur la pile, et une parenthèse fermante dépile tout jusqu'à sa parenthèse ouvrante. Les appels de fonction accompagnent les opérateurs avec un nombre d'arguments qui augmente à chaque virgule rencontrée.

C'est la même technique utilisée dans les moteurs de tableur et les planificateurs de requêtes. Elle s'exécute en temps linéaire, n'a besoin d'aucune récursion, et signale naturellement une expression mal formée : si la pile ne se vide pas proprement à la fin, l'entrée était déséquilibrée.

Virgule flottante, honnêtement

Les résultats sont calculés en double précision IEEE 754, la même arithmétique que utilise chaque navigateur et la plupart des langages de programmation. Elle stocke les nombres en binaire, et une fraction décimale comme 0.1 n'a pas de représentation binaire exacte, voilà pourquoi 0.1 + 0.2 produit célèbrement 0.30000000000000004 plutôt que 0.3.

Arrondir l'affichage à un nombre fixe de chiffres significatifs masque ce bruit sans changer la valeur sous-jacente, ce que fait ici le contrôle de précision. Le régler à 12 garde la réponse lisible tout en laissant largement la place avant les 15 à 17 chiffres qu'un double peut réellement distinguer.

Deux limites valent la peine d'être rappelées. Les entiers restent exacts seulement jusqu'à 2^53, si bien que les très grandes factorielles et multiplications dérivent ; tout ce qui dépasse 170! déborde vers l'infini purement et simplement. Et soustraire deux nombres presque égaux détruit la précision - les chiffres de tête s'annulent et seuls les chiffres de queue bruités survivent - si bien qu'une formule réarrangée pour éviter cette soustraction sera souvent bien plus précise que la forme évidente.

Note open-source : implémenté en JavaScript natif sans bibliothèque tierce.

FAQ

Pourquoi -3^2 donne-t-il -9 au lieu de 9 ?
La convention mathématique lie l'exponentiation plus fortement que le moins unaire, si bien que le carré s'applique à 3 et la négation s'applique ensuite. Écrivez (-3)^2 si vous voulez 9, ce que supposent les tableurs par défaut.
Pourquoi 0.1 + 0.2 n'est-il pas exactement 0.3 ?
La virgule flottante binaire ne peut pas représenter 0.1 exactement, si bien qu'une petite erreur survit à l'addition. L'arrondi à 12 chiffres significatifs affiche 0.3 tandis que la valeur stockée conserve sa pleine précision.
Comment passer la trigonométrie en degrés ?
Réglez l'unité d'angle sur Degrés. Les entrées de sin, cos et tan sont alors interprétées en degrés, et asin, acos et atan renvoient des degrés, sans conversion manuelle pi/180.
Quelles constantes sont disponibles ?
pi, e, tau (2 pi), phi (le nombre d'or) et inf pour l'infini. Les noms ne sont pas sensibles à la casse, si bien que PI et pi fonctionnent tous les deux.
Peut-il gérer les factorielles de grands nombres ?
Jusqu'à 170!, qui est la plus grande factorielle qu'un double peut contenir. Au-delà, le résultat déborde vers l'infini. Les factorielles exigent aussi un nombre entier non négatif.
L'expression est-elle exécutée via eval ?
Non. Elle est tokenisée et convertie en postfixe par un analyseur dédié, puis évaluée sur une petite machine à pile, si bien que rien de ce que vous tapez n'est jamais exécuté en tant que JavaScript.