Math Evaluator

Geben Sie einen mathematischen Ausdruck ein und erhalten Sie das Ergebnis sofort, mit Trigonometrie in Radiant oder Grad, Logarithmen, Fakultäten, Konstanten und vollständiger Operator-Priorität.

Schreiben Sie den Ausdruck so, wie Sie es auf Papier täten. Der Parser verarbeitet verschachtelte Klammern, unäre Minuszeichen, Fakultäten und Funktionsaufrufe mit korrekter Priorität, sodass 2 + 3 * 4 gleich 14 und -3^2 gleich -9 ist, genau wie es die mathematische Konvention verlangt.

Unterstützte Syntax

Operatoren
+ - * / % ^ ! ( )
Konstanten
pi e tau phi inf
Trigonometrie
sin cos tan asin acos atan sinh cosh tanh
Allgemein
sqrt cbrt abs sign exp ln log log2 round floor ceil trunc
Mehrargumentig
min max hypot sum avg pow

Wie aus einem Ausdruck eine Zahl wird

Priorität ist das ganze Problem

Um 2 + 3 * 4 zu lesen, muss man wissen, dass Multiplikation fester bindet als Addition, also ist das Ergebnis 14 und nicht 20. Jeder Operator trägt ein Prioritätslevel und eine Assoziativität. Multiplikation, Division und der Restoperator stehen über Addition und Subtraktion; die Potenzierung steht über allen und ist rechtsassoziativ, also bedeutet 2^3^2 2^(3^2) und ergibt 512, nicht 64.

Das unäre Minus ist der subtile Fall. Die mathematische Konvention setzt es unter die Potenzierung, weshalb -3^2 gleich -9 ist: der Exponent gilt für 3 und die Negation gilt für das Ergebnis. Tabellenkalkulationssoftware widerspricht das bekanntlich und gibt 9 zurück, also wenn Sie je zwei Werkzeuge unterschiedliche Antworten auf dieselbe Formel gesehen haben, ist das meist der Grund. Dieser Auswerter folgt der mathematischen Konvention.

Klammern überschreiben alles, und es lohnt sich, sie frei zu verwenden. Ein Ausdruck, der eine Prioritätstabelle zum Lesen braucht, ist ein Ausdruck, der früher oder später missverstanden wird.

Shunting-yard, kurz

Der Ausdruck wird zuerst in Token zerlegt - Zahlen, Namen, Operatoren und Satzzeichen - und dann von Dijkstras Shunting-yard-Algorithmus in Postfix-Form umgeordnet, wo Operatoren ihren Operanden folgen. 2 + 3 * 4 wird zu 2 3 4 * +. Postfix braucht keine Klammern und keine Prioritätsregeln, weil die Reihenfolge der Token die Struktur bereits kodiert, sodass eine einfache Stack-Maschine ihn in einem einzigen Durchlauf auswerten kann.

Der Algorithmus hält zwei Strukturen: eine Ausgabeliste und einen Operator-Stack. Zahlen gehen direkt in die Ausgabe; ein Operator poppt zuerst jeden gestapelten Operator, der mindestens so fest bindet, bevor er selbst gepusht wird. Klammern wirken als Marker auf dem Stack, und eine schließende Klammer poppt alles bis zu ihrem Partner zurück. Funktionsaufrufe reiten als Operatoren mit, deren Argumentzähler bei jedem gesehenen Komma steigt.

Das ist dieselbe Technik, die in Tabellenkalkulations-Engines und Abfrageplanern verwendet wird. Sie läuft in linearer Zeit, braucht keine Rekursion und meldet einen fehlerhaften Ausdruck natürlich: wenn sich der Stack am Ende nicht sauber leert, war die Eingabe unausgeglichen.

Gleitkomma, ehrlich

Ergebnisse werden in IEEE-754-Doppelgenauigkeit berechnet, derselben Arithmetik, die jeder Browser und die meisten Programmiersprachen verwenden. Sie speichert Zahlen binär, und ein Dezimalbruch wie 0,1 hat keine exakte binäre Darstellung, weshalb 0,1 + 0,2 berühmt 0,30000000000000004 statt 0,3 ergibt.

Das Runden der Anzeige auf eine festgelegte Anzahl signifikanter Stellen versteckt dieses Rauschen, ohne den zugrundeliegenden Wert zu ändern, was hier die Präzisionssteuerung macht. Auf 12 gesetzt hält die Antwort lesbar, während noch reichlich Raum vor den 15 bis 17 Stellen bleibt, die ein Double tatsächlich unterscheiden kann.

Zwei Grenzen sind es wert, erinnert zu werden. Ganze Zahlen bleiben nur bis 2^53 exakt, also driften sehr große Fakultäten und Produkte ab; alles über 170! läuft zu Unendlich über. Und das Subtrahieren zweier fast gleicher Zahlen zerstört die Präzision - die führenden Stellen kürzen sich weg und nur die verrauschten Nachkommastellen überleben - eine Formel, die so umgestellt ist, dass sie diese Subtraktion vermeidet, ist oft weit genauer als die naheliegende Form.

Open-Source-Hinweis: implementiert in vanilla JavaScript ohne Fremdbibliotheken.

FAQ

Warum ergibt -3^2 -9 statt 9?
Die mathematische Konvention bindet die Potenzierung fester als das unäre Minus, also gilt der Quadrat für 3 und die Negation danach. Schreiben Sie (-3)^2, wenn Sie 9 wollen, was Tabellenkalkulationen standardmäßig annehmen.
Warum ist 0,1 + 0,2 nicht genau 0,3?
Binäre Gleitkommazahlen können 0,1 nicht exakt darstellen, also überlebt ein winziger Fehler die Addition. Das Runden auf 12 signifikante Stellen zeigt 0,3 an, während der gespeicherte Wert seine volle Präzision behält.
Wie schalte ich die Trigonometrie auf Grad um?
Setzen Sie die Winkleinheit auf Grad. Eingaben in sin, cos und tan werden dann als Grad interpretiert, und asin, acos und atan geben Grad zurück, ohne manuelle pi/180-Umrechnung.
Welche Konstanten sind verfügbar?
pi, e, tau (2 pi), phi (der Goldene Schnitt) und inf für Unendlich. Namen sind groß-/kleinschreibungsunempfindlich, also funktionieren PI und pi gleichermaßen.
Kann er Fakultäten großer Zahlen verarbeiten?
Bis 170!, was die größte Fakultät ist, die ein Double halten kann. Darüber läuft das Ergebnis zu Unendlich über. Fakultäten verlangen zudem eine nicht-negative ganze Zahl.
Wird der Ausdruck über eval ausgeführt?
Nein. Er wird tokenisiert und von einem eigenen Parser in Postfix umgewandelt, dann auf einer kleinen Stack-Maschine ausgewertet, sodass nichts, was Sie eingeben, jemals als JavaScript ausgeführt wird.