![]() |
Formelinterpreter, Programmierbarer Tabellenrechner
Liste der Anhänge anzeigen (Anzahl: 2)
Interpreter für anwenderdefinierte Funktionen
Die Unit Formel exportiert:
Delphi-Quellcode:
Verwendung:
type
TPar = array[0..9] of extended; function FWert(FStr: string; const P: TPar): extended; // Formelinterpreter Der Anwender übergibt dem Programm eine Formel als Text mit einer Reihe von Parametern vom Typ extended. Mit dem Interpreter berechnet das Programm Werte dieser Funktion. Die Formel ist wie ein arithmetischer Ausdruck in Objekt-Pascal zu schreiben. In der Formel sind als Operanden zugelassen: - Die Variable x - Die Parameter a, b, c, d, w - u für cos(w), v für sin(w) - x^n als Potenz von x mit ganzzahligen Exponenten n=0..9. - Zahlenkonstanten (Dezimalzahlen, Gleitkommazahlen ) - Die Konstante PI = 3.14159265358979 - Geklammerte Ausdrücke: '( Ausdruck )' - Standardfunktionen mit einem Ausdruck w als Argument -- ABSw) -- INT(w) -- FRAC(w) -- SQR(w) -- SQRT(w) -- EXP(w) -- LN(w) -- SIN(w) -- COS(w) -- ARCTAN(w) Zwischen zwei Operanden muß ein Operator stehen: '*', '/' Multiplikation, Division mit Vorrang vor Addition und Subtraktion ausgeführt. '+', '-' Addition, Subtraktion Ein '+' oder '-' kann als monadischer Operator vor einem Ausdruck stehen. Zwischen Operanden und Operatoren können Leerzeichen stehen. Kommentare nach einem ';' Fehlermeldungen: 'Doppelter Operator', 'Fehlender Operator', 'Fehlende Klammer', 'Überzählige Klammer', 'Fehler in Konstante', 'Fehlender Exponent', 'Illegale Funktionsbezeichnung', 'Illegale Variablenbezeichnung', 'Fehlendes Funktionsargument', 'Exponent von x^n keine Ziffer', 'Fehlender Operand', 'Syntaxfehler'. Laufzeitfehler 'Division durch 0' 'SQRT mit negativem Argument' 'Ln mit negativem Argument' Der Interpreter ist ein Musterbeispiel für die Leistungsfähigkeit rekursiver Programmierung. Er verwendet Rekursive Aufrufe zur Berechnung geklammerter Ausdrücke und der in Klammern stehenden Argumente von Funktionen. Programmierbarer Tabellenrechner Ich zeige die Anwendung des Interpreters am Beispiel eines programmierbaren Tabellenrechners. Der programmierbare Tabellenrechner gibt nach Vereinbarung der Abszisseneinteilung, Formel und Parameter eine Tabelle mit Funktionswerten der analytischen Funktionen zu den äquidistanten Abszissen aus. [edit=Matze]Tippefehler im Titel korrigiert ("Tabellenrwchner"), damit das Thema über die Suche leichter gefunden wird. MfG, Matze[/edit] |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Hi,
das sieht sehr nach Mathe-Parser aus. Es gibt hier im Forum den HAM-Parser. ich glaube aber, der liegt auf Eis. Auch ein sehr schönens Tool um solche Aufgaben zu implementieren. Vorallem ist er durch den Programmierer recht "einfach" für neue Funktionen erweiterbar. Gruß oki |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Es gibt nicht nur den HAM. Es gibt noch zig andere Matheparser hier und im Netz. Und diese Parser sind i.A. vollständig. Also man muss sich nicht in der Variablenbezeichnung noch in der Anzahl o.ä. einschränken. Man kann da eigene Funktionsaufrufe integrieren.
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Das ist ein Mathe-Parser.
Dabei kam es mir auf die Beschränkung der Parameteranzahl und Bezeichner an, um ihn möglichst einfach bei optimaler Laufzeit in die Anwendung einzubinden. Ich habe noch keine Anwendung geschrieben, die sinnvoll nach weiteren Variablen bzw. andern Bezeichnern gefragt hätte. |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Bei Anwendungen, in denen der normale Benutzer selbst Formeln erstellen können soll, sind sinnvolle Bezeichner sicherlich hilfreich. Und HAM hat ein Assembler-Plugin, es würde mich nicht wundern, wenn das deinen Parser schlagen würde ;)
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
"Dax" schreibt:
Zitat:
Zitat:
40 Jahre Beschäftigung mit Interpretern (von Focal über HP-Language zu verschiedenen Basic-Dialekten) haben mich gelehrt, dass Laufzeitperformance nur durch Einschränkung der syntaktischen Möglichkeiten zu erreichen ist. Daher habe ich absolut keine Angst, dass irgend ein Parser den Formeleditor hinsichtlich der Geschwindigkeit schlägt. Jeder Parser der sinnvolle Bezeichner für Variable verwendet, muß deren Adressen aus Listen suchen, während Variablen, die nur mit einem fest vergebenen Buchstaben bezeichnet werden, direkt adressierbar sind. |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Zitat:
Zitat:
Zitat:
Zitat:
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Guten Morgen Herr Winter,
vielen Dank, dass Sie uns einen Beitrag für die DP reingestellt haben. Ihr Programm/die Unit braucht nichts zu schlagen, dies ist auch nicht der Sinn dieses Forums. Jeder Beitrag ist hier willkommen. Ich habe mir den Formelparser kurz angesehen, der Sourcecode ist für mich lesbar und zudem kommentiert. Die Beiträge von Dax sind, sorry, respektlos, unverschämt und dienen dazu andere User davon abzuhalten, hier Beitäge einzustellen und damit uns ihr Wissen vorenthalten. Ich bin in diesem Forum, weil solche Beiträge wie von Dax hier selten vorkommen, und das Lesen von Beiträgen ohne sinnleerer Diskussionen Spass macht und immer wieder lehrreich sind. Und um schon jetzt auf Antworten vorzubeugen: Jeder darft seine Meinung kundtun, aber bitte mit ein Minimum an Respekt und Umgangsformen. Und da ist ein zwischengeschobens "Augenzwinkern" wie von "DAX" zwischen den Zeilen schon recht dreist. An DAX: Um in Deinem Ton mal zu reflektieren: Dies ist nun Deine Aufgabe "DAX" heute gefälligst Deine eigenen Zeilen unter den genannten Gesichtpunkten zu betrachten und darüber einmal nachzudenken. Und zwar solange, bis Du verstanden hast, was Du eigentlich hier geschrieben hast. Das wirst "DU" akzeptieren müssen! Ich hoffe, dass der DP solche Beiträge weiterhin erspart bleiben. |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Zum Glück leben wie in keiner Ein-Programm-pro-Problem-Welt, so dass jeder das preverierte Programm verwenden kann. Imho ist ein Programm nicht schlecht, nur weil es möglicherweise ein anderes gibt, welches etwas kann, was dieses nicht kann.
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Huch? Was ist denn hier los?
Ich halte Herrn Winter für durchaus in der Lage, den 'Fedehandschuh' :zwinker: aufzuheben und entsprechende Vergleiche anzustreben, wenn ihm danach ist. Denn ab einem gewissen Alter sieht man Wettbewerben dieser Art durchaus gelassen entgegen (es gibt Wichtigeres). Allerdings ist es auch so, das man bei einer 40 jährigen Erfahrung, die gegen einen eventuellen Performancevorteil des HAM-Parsers in die Waagschale geworden wird, mit einer gewissen Diskussionsfreudigkeit rechnen muss. Wichtig ist der Ton und da unterstelle ich Dax als Ex-Moderator sowohl ein gewisses Fingerspitzengefühl als auch ein bestimmtes Niveau. Soweit ich das beurteilen kann, handelt es sich hier um ein Gefecht der Argumente, das bisher sachlich geführt wird. Beide Parteien dürften in der Lage sein, die Diskussion entsprechend zu führen. |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Guten Morgen, Herr Winter!
Ich hätte einige Anregungen zu Ihrem Formelinterpreter. Über die Geschwindigkeit kann ich mir an dieser Stelle kein Urteil bilden - vielleicht hat ja irgendjemand hier Zeit, um einen Geschwindigkeitsvergleich mit Dax' Parser anzustellen. Zu Ihrem Parser: * Hat es einen besonderen Grund, dass nur Ziffern als Exponenten erlaubt sind? Selbstverständlich lässt sich x^x in exp(x*ln(x)) umschreiben, doch wäre x^x eine weit kürzere Schreibweise - und da der Potenzoperator ja ohnehin vorhanden ist könnte er doch erweitert werden * Mir scheint als würden die Negation und die Subtraktion (unär und binär) bezüglich ihrer Priorität nicht unterschieden werden, was bei Ausdrücken wie 1/-x oder 1--x zu einem Syntaxfehler führt ("doppelter Operator"). Da das durch entsprechende Klammersetzung umgangen werden kann ist das allerdings kein Problem - es ließe sich vermutlich ohenhin darüber streiten, ob die Ausdrücke überhaupt syntaktisch korrekt sind (ebenso wie -x^-x). Meiner Meinung nach sind sie das, aber ich weiß nicht, wie streng die dem Parser zugrunde liegende Grammatik definiert ist und ob sie derartige Ausdrücke überhaupt erlaubt (e scheint so, als wäre das nicht der Fall) * Die Euler'sche Zahl als Konstante wäre noch praktisch - so muss man nicht immer exp(1) schreiben, wenn man sie benötigt Das Programm gefällt mir ansonsten sehr gut :thumb: Dust Signs |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Lasst doch den HAM-Parser mal dagegen laufen. Beide Programme sind gut, da bricht sich ehedem keiner einen Zacken aus der Krone.
Vom Programmcode her gefällt mir die Unit gut, da sie dokumentiert ist. Das ist nicht selbverständlich. Also eine runde Sache ! Grüße // Martin |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
OK, der Code hier ist zumindestens recht kurz und übersichtlich,
aber bei der Einrückung könnte man noch etwas aufräumen. PS: bezüglich Geschwindigkeit:
Delphi-Quellcode:
und auch wenn du in der Formel alles kurz halten willst ... die Funktions- und Variablennamen könnte man dennoch etwas länger und aussagekräftiger gestalten (diese werden dann eh vom Compiler rauskompiliert)
until Pos(Zei,'0123456789')=0;
// entspricht until not (Zei in ['0'..'9']); // und enthält keine Char-To-String-Umwandlungen sowie kein großen String-Vergleich |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Hier mal eine konstruktive Kritik :wink: (bzw. Fehlerreport/Frage). Beim Progtabrechner liefert y=x^2^3 dieselben Ergebnisse wie y=x^2 ohne Hinweise auf Fehler oder so. Eigentlich wollte ich nur testen ob x^2^3 als (x^2)^3 oder als x^(2^3) geparst wird.
Ich glaube, die Implementation kommt mit x^y^z ohne Klammern nicht klar, liefert aber keinen Fehler. Gammatester |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Liste der Anhänge anzeigen (Anzahl: 3)
Geschwindigkeit ist ja nicht alles. Hauptsache ein Algorithmus ist nicht unnötig zu langsam. Das ist hier nicht der Fall. Natürlich kann dieser Parser nicht mit HAM (soweit ich es von der Beschreibung kenne, getestet habe ich es nicht) mithalten. Wie Dax schon sagte, HAM produziert nach dem einmaligen Parsen direkt Bytecode bzw (ich nenne ihn) Opcode. Da dauert zwar das Parsen ein wenig länger, aber wenn man die Formel mehrmals verwendet macht sich da ein enormer Geschwindigkeitsunterschied bemerkbar. Durch den Bytecode steht die Formel nach dem Parsen nun einmal so im Programm, als hätte man die Formel direkt in Delphi vorm Compilieren eingetragen. Da kann kein anders gearteter Parser mithalten.
Ich habe mal kurz ein Vergleichsprogramm geschrieben. Allerdings ohne HAM sondern mit meinem eigenen Parser, der auch Opcode erstellt und mit ![]() Meiner soll allerdings nicht in die CodeLib sondern ist hier nur zum Vergleich. Bedienung: Links ist das Bedienfeld. Dort kann man oben die Formel eingeben .Ich habe mal nur die Abhängigkeit von x als Laufvariable eingebracht. Darunter kommt dann das Intervall von wo bis wo und in welchen Schritten die y Werte berechnet werden sollen. Dann kommen drei Pushbutton, welche den jeweiligen Parser starten (OpCode=>Meiner ; Formel=>H. Winter; TTR->aus verlinktem Tutorial) Darunter sind zwei Radiobuttons. Da kann man auswählen, ob die Funktion im gegebenen Intervall gezeichnet werden soll oder nur eine Zeitmessung der Funktionsberechnung im gegebenen Intervall mit n Wiederholungen erfolgen soll. Die Wiederholungen sind nur dafür da, um die Streuung zu verringern. Die Zeitangabe im gelben Feld wird immer für den gesamten Vorgang angegeben. Das Zeichnen ist eigentlich nur zur Kontrolle, ob der Parser auch richtig rechnet. Hier sieht man, dass mein Parser ab 5 Werten besser wird als der hier vorgestellte. Also wenn man die gleiche Formel für 5 verschiedene x verwendet liegt der OpCode vorn. Das ist auch das, was Dax erwähnte. Ansonsten kann ja jeder mal selber nachsehen. Der TTR liegt immer deutlich hinten. Das ist allerdings noch eine Frage des Funktionenumfangs. ------------------------------------------------------------- Soweit dazu. .. Deswegen ist der hier vorgestellte Code nicht unbedingt schlecht. "GoTo-s" sind allerdings doch etwas veraltet. Naja, und die Einschränkungen bezüglich Exponentialrechnung sind auch eher ungewöhnlich. Ich weis jetzt nicht, was noch so fehlt. |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Dust Signs schreibt
Zitat:
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Liste der Anhänge anzeigen (Anzahl: 2)
Vielen Dank an Gammatester!
An y=x^2^3 habe ich nicht gedacht. Es stimmt: Die Implementation kommt mit x^2^3 ohne Klammern nicht klar. ^n mit n 0..9 muß wie ein Operator behandelt werden, damit fehlt bei x^2^3 eine Fehlermeldung. Nochmals vielen Dank, ich habe die Fehlermeldung 'Fehlender Operand' für aufeinanderfolgende Potenzierungen eingefügt. |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Warum nicht lieber den "Bug" fixen?
Zitat:
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Zwei Anmerkungen hätte ich noch:
* 0^0 ist nicht 1, sondern undefiniert * 2^(-1) ist nicht erlaubt. Die Fehlermeldung macht zwar insofern Sinn, als dass - keine Ziffer, aber -1 sehr wohl eine Zahl ist. Oder übersehe ich hier etwas? * -1^2 ist nach meiner Interpretation 1, da das unäre Minus eine höhere Priorität hat als der Potenzoperator, d.h. der Ausdruck äquivalent zu (-1)^2 sein müsste anstatt zu -(1^2) Dust Signs |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Zitat:
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Zitat:
Dust Signs |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
So wie ich das sehe ich die ganze Potenzimplementation schlecht. ^ sollte ganz normal wie +, *, -, / behandelt werden. Und wenn man das Rechnen einfach Delphi überlässt, hat man auch mit 0^0 keine Probleme.
Meiner Meinung hat - als Vorzeichen dieselbe Priorität wie der Operator. Lässt sich so eig. auch leichter implementieren. Notfalls sollte man das einstellen können, aber ich denke, -1^2 = -(1^2) ist Standard. |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Ware das nict so hätten die Elektrotechniker ein Problem
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Zitat:
Dust Signs |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Es würden sich die komplexen Terme nicht mehr aufheben
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
@mkinzler: Nur, damit ich nichts falsch verstehe: beziehst du dich auf die Definition von 0^0 oder die Priorität des unären Minusoperators? Ersterem kann ich nicht zustimmen, da 0^0 ein undefinierter Ausdruck ist (vgl.
![]() Dust Signs |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Nein auf den das
1^2 = -(1^2) |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Zitat:
Dust Signs |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Möglicherweise hat die [-] Taste geklemmt. :mrgreen:
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Dann verstehe ich aber trotzdem nicht, welche komplexen Terme dann keine gültige Lösung mehr liefern würden. Könntest du ein Beispiel liefern, mkinzler? Es würde mich interessieren - vielleicht übersehe ich ja gerade irgendetwas wesentliches.
Dust Signs |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Zitat:
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Bisher dachte ich immer, dass die Prioritäten folgendermaßen definiert wären (von niedrig zu hoch):
+ binär - binär * binär / binär ^ binär + unär - unär Bitte sagt mir, falls ich falsch liege. Die Anmerkung oben zu -1^2 = -(1^2) basierte auf der Annahme, dass die Prioritäten in Herrn Winters Parser nicht den oben aufgeführten entsprechen. Dust Signs |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
offiziell (siehe OH "Ausdrücke")
Zitat:
Zitat:
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Zitat:
Dust Signs |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
:gruebel: Warum verstehe ich hier eigentlich nur Bahnhof? Ich dachte, es handelt sich hier um einen mathematischen Parser? Zumindest mit meinem begrenzten Mathewissensschatz wüsste ich nicht, warum -1^2 = 1 sein sollte.
Ja, ich habe mich im Wiki über das "unäre Minus" informiert. Und da steht: Zitat:
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Hu. Ihr würdet euch also wirklich y = -x² als nach oben geöffnet vorstellen :gruebel: ? Dann sollte man alle Mathelehrer und Taschenrechner sofort auf den Müll schmeißen :drunken: . Und
![]() @himi: *hust* Vielleicht solltest du lieber eine Sprache hinzuziehen, die überhaupt einen Power-Operator kennt :zwinker: . Nehmen wir doch mal Python, das dürfte die am weitesten verbreitete sein: Zitat:
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
Zitat:
|
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
hat wer 'ne Zeitmaschiene?
(vielleicht sollte ich mal statt Delphi meine alte Mathelehrerin besuchen ... aber jetzt wo du's sagst :wall: ) |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
@Daniel, Khabarakh: ihr hattet Recht, -3^2 = -9, auch nach
![]() Dust Signs |
Re: Formelinterpreter, Programmierbarer Tabellenrwchner
[quote="Dust Signs"]
Zitat:
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:27 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz