![]() |
Re: Kompilierender Matheparser
Ich glaube, das sprengt schon sehr den Rahmen des Parser ;)
Aber: Weil das Ding wirklich verdammt schnell ist, könnte ich versuchen eine Approximationsmethode (:mrgreen:) einzubauen, die die Formel so lange durchrechnet, bis x bis zu einer gewissen Grenze mit der wirklichen Lösung übereinstimmt (manche wissenschaftliche Taschenrechner bieten solche Lösungsmethoden auch an). Wäre das was? ;) read you, Dax |
Re: Kompilierender Matheparser
es gibt doch variablen in dem parser, oder? kann er also nicht
(lg(x))² - lg(4x-4) so auflösen, dass zum schluss der term halt etwas einfacher da steht? |
Re: Kompilierender Matheparser
Ich fürchte nicht :?
Der Parser wandelt die Formel intern in einen Stream aus Funktionsaufrufen um, ohne wirklich zu "wissen", was er da tut. Das eigentliche lösen der Formel wird auch nicht vom Parser übernommen, sondern von den registrierten Funktionen und Operatoren. In der Hinsicht sehe ich im Moment keine wirkliche Möglichkeit, aber wenn du denkst, du könntest es einbauen, nur zu :) read you, Dax |
Re: Kompilierender Matheparser
was, ich denke? um himmels willen nein.....
wenn ich so gut in mathe wär, dass ich das könnte, würd ich nicht danach fragen, ob der parser meine hausuafgaben machen kann.... :stupid: aber das mit dem approximationsverfahren wär natürlcih ne idee - ich kann da aber wirklcih nix machen. kenn mich da weder in theorie noch in praxis damit aus. |
Re: Kompilierender Matheparser
Danke Anakin (;)), ich seh mal zu, das es irgendwann kommt :)
|
Re: Kompilierender Matheparser
Ich lebe noch ;) und komme gleich mit dem nächsten Problem. Diesmal wieder die Formel vom Anfang. Am besten du machst dir mal ein Testprogramm, in dem alle Formeln drin sind, berechnet werden und das Ergebnis geprüft wird. Testet sich vermutlich leichter ;)
Delphi-Quellcode:
Parser:=TExCQParser.Create;
Parser.SolveMode:=smVM; Parser.PreSolve:=true; Parser.RegisterVariable('BaseRange'); Parser.RegisterVariable('Range'); Parser.RegisterVariable('UnitTreff'); Parser.SetVariable('BaseRange',[10]); Parser.SetVariable('UnitTreff',[8]); Parser.SetVariable('Range',[10]); Parser.Parse('UnitTreff*(1/(Range*Range))*(BaseRange*BaseRange)'); ShowMessage(FloatToStr(Parser.Solve.X)); Parser.Free; |
Re: Kompilierender Matheparser
Huhu :)
Ich hab den Serializer für den numeralen Stack einmal komplett neu geschrieben und den Parser mit allen mir zur Verfügung stehenden Parsermörderformel (;)) getestet - erfolgreich :) ThisThread.NewVersion; ;) read you, Dax |
Re: Kompilierender Matheparser
Zitat:
Hehe. Nein natürlich nicht. Schaue es mir mal heute Abend mal an und such nach den Formeln, die du noch nicht kennst ;) |
Re: Kompilierender Matheparser
Der neue Serializer scheint wirklich gut zu funktionieren ;) Falls ich ne Formel finde, die den deine Komponente ins schleudern bringt, melde ich mich ;)
Ach ja, was hälst du denn davon Funktionen wie min und max mit einzubauen? |
Re: Kompilierender Matheparser
Zitat:
Zitat:
Bis dahin kannst du es ja selbst machen :mrgreen: Kuck dir einfach mal die ExCQP_PreDef.pas an, dort wird unter anderem (auch wenns nicht ganz Absicht war ^^) gezeigt, wie man Funktionen und Operatoren registriert :) read you, Dax |
Re: Kompilierender Matheparser
Zitat:
Zitat:
Hi Heute! Ich hab die letzten Tage mal mit C# ein bisschen Parser gebastelt (nur zu meinem Vergnügen). Aber das ist echt nen Thema, für das ich mich begeistern könnte (glaub ich, von dem was ich bisher gemacht habe her). Plus Minus Mal Durch Hoch... (normale binäre Operatoren -> check). Operator Precedence (-> check). Klammern (-> check). Ein Protokoll führen. Das geht ja alles ganz schick. Aber was mir dann recht schnell in den Sinn kam, war das Lösen von Gleichungen (erstmal aufgrund simpler Umformungen). Es müssten [irgendwann] natürlich auch so Sachen wie "Rechenweg anzeigen" und "benutzerdefinierte Formelsammlung" gehen. Die Formelsammlung sollte im Endeffekt ermöglichen, quasi alle Gleichungen (Ungleichungen) zu Lösen, die man sich so vorstellen kann. Natürlich mit allen Anmerkungen (Rechenweg, Annahmen...). Also weniger (aber auch, die Basis muss stehen) Numberchrunchen, sondern auch nen schickes Drumrum auf höherem Level wie es z.b. Derive bietet. Bei Interesse wäre ich bereit, mal genauer _mit_-zuplanen. Michael |
Re: Kompilierender Matheparser
Interesse besteht garantiert, alle potenziellen Mitarbeitenwoller sind herzlich eingeladen :)
|
Re: Kompilierender Matheparser
Ahhh :wall: Ich hab grad einen tödlichen Fehler im Serializer ausgebügelt.. :roll: Aber die wieder mal neue Version sollte jetzt wirklich funktionieren.. Was ich zwar nicht glaube, weils bisher nie richtig geklappt, aber den Versuch ist es ja wert ;)
read you, Dax |
Re: Kompilierender Matheparser
Hallo mal wieder ;)
Die jetzige Version hat nur eine Neuerung: die von Dust Signs indirekt geforderte Information über die Fehler ;) read you, Dax |
Re: Kompilierender Matheparser
Na Hallo!
Ich bin gewissermassen dein ![]() Hier eine Liste von noch falsch interpretierten Ausdrücken: -2^2 => 4 (statt -4) -(1/2) => Access Violation (1-2)+3 => Access Violation a^b^c => Hoch wird standardmässig oft rechtsgeklammert (siehe z.B. Definition der Gausschen Glockenkurve (keine explizite Klammerung) vs. Potenzgesetz (explizite Klammerung)) Sonst cool :) |
Re: Kompilierender Matheparser
Zitat:
Zitat:
Zitat:
Zitat:
read you, Dax |
Re: Kompilierender Matheparser
Zitat:
wenn dir diese notation geläufig ist.... :wink: man könnte auch sagen alle geraden exponenten erzeugen ein positives ergebnis, aber auf das niveau müssen wir uns ja nicht herablassen :mrgreen: EDIT: oha, ich habe wohl was verwechselt. er bemängelt ja nicht, dass das ergebnis -4 IST, sondern dass es seiner Meinung nach -4 SEIN SOLLTE. womit dax natürlich absolut recht hat. also nix für ungut. |
Re: Kompilierender Matheparser
Zitat:
Greetz alcaeus |
Re: Kompilierender Matheparser
da es sich hier imho um den unären vorzeichen-wechsel-operator handelt (und nicht um nen dummes rechen-minus) hat es einen höheren "rang" als das potenzieren, und sollte zuerst ausgewertet werden, also
(-2)^2 = 4 |
Re: Kompilierender Matheparser
Da hat nailor recht ;)
Das - als Präfix negiert die nachgestellte Zahl/Variable mit höchster Priorität. Die unär-Präfixe werden sowieso als allererstes ausgewertet, auch vor den Postfixes ;) |
Re: Kompilierender Matheparser
btw: du hast zwei demo-exen zum download. kannst du mal jeweils ne kleine beschreibung dazumachen oder irgendwie anders deutlich machen, was was ist?
|
Re: Kompilierender Matheparser
Zwei? Das wäre mir neu. Da sollte nur eine sein, und zwar die im ersten Beitrag. Und die ist dazu gedacht, zu demonstrieren, was das DIng so drauf hat ;)
|
Re: Kompilierender Matheparser
Code:
Beschreibung:
Download Dateiname: ECQPDemo-Exe.zip Dateigröße: 233,04 KB Heruntergeladen: 33 mal Beschreibung: Download Dateiname: ExCQParser.zip Dateigröße: 18,34 KB Heruntergeladen: 110 mal Beschreibung: Download Dateiname: ECQPDemo-Exe.zip Dateigröße: 233,01 KB Heruntergeladen: 68 mal |
Re: Kompilierender Matheparser
na an den dateigrössen sieht man ja wohl, dass das zwei mal die selbe demo ist, aber wohl in verschiedenen versionen.
würd ich jetzt vermuten. |
Re: Kompilierender Matheparser
Sorry, da muss beim Upload was schief gelaufen sein.. jetzt müssts aber stimmen :oops:
|
Re: Kompilierender Matheparser
-2^2 = -(2^2) = -4 (<- diskussionslos)
Hmm, hast du schon mal ein Polynom gesehn? -x^2+x+1 interpretiert man ganz bestimmt nicht als (-x)^2+x+1; sondern als -(x^2)+x+1 Glaube wohl kaum, dass du einen Taschenrechner findest, der anders rechnet ;) |
Re: Kompilierender Matheparser
Na ja, dann werde ich mal wieder was ändern müssen. Das unäre - wird wohl eine Variable ^^
Edit: Hm, nö, geht nicht als Variable. :? Noch eins: Jetzt gehts ;) |
Re: Kompilierender Matheparser
Sooo mal wieder eine neue Version ;) Diesmal sind wieder ein paar Bugs raus.. der Presolver hat manchmal noch ein wenig Mist gebaut, und Variablen und Funktionen entfernen war noch Case-sensitiv. Ansonsten.. nix :)
read you, Dax |
Re: Kompilierender Matheparser
Hi, hast ja lange nichts mehr von mir gehört. Heisst nur dass ich keine Probleme hatte ;)
Habe jetzt mal wieder MemCheck ( ![]() |
Re: Kompilierender Matheparser
Hmm.. Erst mal sollte ich wieder Delphi installieren, am besten mach ich das sofort. UNd danke für den Tip ;)
Ich würde mal vermuten, das da einige Variablen noch Zerstört werden, wer weiß was da schiefgelaufen ist.. |
Re: Kompilierender Matheparser
So, die Memory Leaks sind alle ausgebügelt :) Musste beim Assemblieren leider auf Strings umsteigen..
Na ja, viel Spass mit der neuen, verbesserten Version ;) Edit: Ein kleines Problem mit der Assemblage ist jetzt auch behoben :) |
Re: Kompilierender Matheparser
@Dax,
inwieweit kann man den benutzten Datentyp der Berechnungen verändern ? Anders gefragt: kann man deinen Parser unabhängig vom Datentypen wie zb. Double machen ? Hintergrund meiner Fragen ist es das ich einen solchen Parser suche der zb. mit meinen supergroßen Integern arbeiten kann. Gruß Hagen |
Re: Kompilierender Matheparser
Klar, der Parser kann rein theoretisch sogar mit Pointern rechen ;) Alles, was dazu anzupassen wäre, sind ECQP_Def.TFloat und eben die Berechnungsroutinen in der Unit ExCQPreDef (ich hoff die Namen stimmen ;))
Darüber hinaus ist wirklich nichts nötig, da die Variablen von einer Klasseninstanz beherbergt werden. Klasseinstanzen sind ja bekanntlich Pointer, und nur diese Pointer werden auf dem Eval-Stack rumgeschoben, was an und für sich schon einen enormen Geschwindigkeitsvorteil bringt. Ich hätte nie damit gerechnet, das jemand den Parser für deine Riesenzahlen modifizieren wöllte, aber dem steht nichts im Wege :) read you, Dax |
Re: Kompilierender Matheparser
Hallo, Leutz! Bin grad dabei, ein umfangreiches Matheprogramm mit Formeleditor etc. zusammenzubasteln, da kommen mir diese Codeschnipsel wie gerufen. Werd mal sehen, ob ich sie problemlos in mein Matheprogramm implementieren kann. Sieht aber auf jeden Fall seh interessant aus, werd in Kürze mein Projekt vorstellen (hoffe,daß es jetzt deutlich schneller fertig wird...).
|
Re: Kompilierender Matheparser
Hi,
ich wollte nur mal einen Fehler bemerken, der mir gerade unterkam. Evtl. ist der bekannt, aber alles hier zu lesen... Nun ja ;-) Wenn ich als Formel (Beispiel aus dem 4. Beitrag) folgende eingebe: 2+4, dann rechnet er fein. Wenn ich 2+A eingebe, dann rechnet er auch fein, wenn ich 2+4+4 eingebe, macht er mich weiterhin glücklich. Gebe ich aber 2+A+4 ein, dann wirft er mir eine AV entgegen :-/ :witch: P.S: Diese Fehler kommen im Modus smRM, im Modus smVM geht es gut ;) |
Re: Kompilierender Matheparser
Zitat:
|
Re: Kompilierender Matheparser
Ohhh sorry Leute, hab den Thread vollkommen aus den Augen verloren.. :oops: Das Projekt ist natürlich nicht (vollkommen *hust*) eingestellt, aber wenn ich mir meinen Code so ansehe.. Da ist sehr viel Optimierungspotenzial. Vor allem beim smRM.. Und ne Menge Fehler wies aussieht auch.
Ich glaube ich werd das Ding mal fast komplett neu schreiben, diesmal aber ein wenig anders. Das Interface wird nach Möglichkeiten so gleich bleiben wies nur geht, und das ganze sollte wirklich schneller sein ;) Wenn niemand Einspruch erhebt natürlich, ansonsten behalt ich diese Sourcen bei :) *thread vorsichtshalber markier* |
Re: Kompilierender Matheparser
Zitat:
|
Re: Kompilierender Matheparser
Einspruch abgewiesen :mrgreen:
Aber mal ernsthaft: Was spricht denn dagegen, intern alles zumindest ein wenig neu zu schreiben und damit vielleicht stabiler? Nur aus Interesse :) |
Re: Kompilierender Matheparser
Spontan würde ich sagen:
Nix! Solange es nicht ein Jahr dauert... :zwinker: |
Alle Zeitangaben in WEZ +1. Es ist jetzt 19:49 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