Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » Mathematik Parser

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
08.03.2003, 14:46 Uhr
~-CodeMaster-
Gast


Hi,
Ich wollte mal fragen ob sich hier jemand mit Mathe Parsern auskennt (Rechnung die als String übergeben wird ausrechnen). Ich bin gerade dabei so einen zu programmieren und bin mit dem Basecode (Addieren Subtrahieren, Dividiern, Multiplizier, Exponent für doublevariablen) fast vertig.
Jetzt würde ich gern von euch wissen, wieviel Leistungseinbusen bei einem guten Parser normal sind gegenüber, der Leistung die ein compiliertes Programm ereicht bei dem der gleiche Term im Sourcecode einer Doublevariable zugewiesen wird.
Ich hoffe auf schnelle und kompetente Antwort.

mfg
-CodeMaster-
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
08.03.2003, 15:16 Uhr
virtual
Sexiest Bit alive
(Operator)


Ich kann Dir keine Prozentangaben machen, um wie viel Prozent ein geparster Term langsamer ausgewertet wird als ein Compiliertes gegenstück. Das hängt auch von der Qualität des Parsers ab. Letztlich ist der Unterschied jedoch gewaltig: Der String "12.34+56.78" etwa muß ja zerlegt werden, dann in doubles umgewandelt werden und schließlich das ergebis berechnet werden. Also jede Menge String operationen. Dem gegenüber eine Berechnung einfach so inline ist natürlich deutlich schneller.
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
08.03.2003, 18:59 Uhr
~0xdeadbeef
Gast


Soweit ich weiss, ist das normale Verfahren, den String auf zwei Stacks zu legen (einen für Zahlen, einen für die Symbole) und die Gleichung so in eine Art auseinandergenommene Postfix-Notation zu zerlegen, die dann sehr simpel auszurechnen ist. Genauere Beschreibungen des Algorithmus stehen in ziemlich vielen Büchern über Programmierung, weil das ein sehr klassisches Beispiel ist. Wenn ich mich recht entsinne, gab es so eine Übung samt Lösung in "C++-Programmierung" von Andre Willms aus dem Addison-Wesley-Verlag, aber 100%ig weiß ich das grad nicht.

Die O-Zeit des Algorithmus dürfte linear mit der Länge des Strings steigen. Auf jeden Fall dauert es _deutlich_ länger (mit deutlich länger meine ich in diesem Fall einen Multiplikator irgendwo kurz vor unendlich), als wenn du die Gleichung fest einkompilierst. In dem Fall arbeitet das Ding auch mit konstanter O-Zeit und ist innerhalb weniger Rechenschritte fertig, wenn du das ganze durch nen Matheparser laufen läßt, musst du sowohl die Rechnung, die du andernfalls fest einkompiliert hättest, durchführen, als auch den String zu parsen und zwei Stacks zu verwalten. Mehr Arbeit dauert halt auch länger.
Ein Mathe-Parser macht nur dann Sinn, wenn der User dir vorgibt, welche Gleichung du ausrechnen sollst, ansonsten bist du besser damit bedient, die Gleichung fest einzukompilieren.

Leitregel an der Stelle: Wenn du Performance willst, mach soviel wie möglich zur Compilezeit. Ein wunderbares Beispiel für performanten Code gibt es hier: http://community.borland.com/article/print/0,1772,10526,00.html - auch wenn darunter in diesem Fall die Übersichtlichkeit extrem leidet.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
08.03.2003, 19:06 Uhr
Pablo
Supertux
(Operator)


Ich hab heute grad dieses Problem gelöst und ich hab einen Taschenrechner in C++ programmiert, bei dem man einen Ausdruck einzugeben ist.
BSP:
5+3;
Das Programm erkennt das (Parser) und berechnet 8.
Man kann sogar Variable definieren:
Bsp:
radius=1;a=pi*a*a;
(pi und e sind schon definiert) und die Ausgabe ist dann
1 (für den ersten Ausdruck)
3,1514 (für den zweiten Ausdruck)

Guck mal unter
http://pcpool.mathematik.uni-freiburg.de/~pabloy/
(Menü Java/C/C++)
Ich hab das Programm heute hochgeladen.
Mach's gut
gruss
Pablo
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!

Dieser Post wurde am 08.03.2003 um 19:07 Uhr von Pablo Yanez Trujillo editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
08.03.2003, 22:06 Uhr
~-CodeMaster-
Gast


Danke!! War sehr aufschlussreich.

Bei einer komplizirteren Gleichung (10 Rechenschritte) bin ich bei 1000 durchläufen ca. 7000% langsamer. Is das noch ok??

Pablo deien Code werd ich mir jetzt auch noch mal ansehen. Danke für den Link.


mfg.
-Codemaster-
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
09.03.2003, 10:43 Uhr
~PoRcUpInE
Gast


Hi,

Du musst auf davon ausgehen, das ein guter Compiler das Programm optimiert, und für Rechnungen im Quelcode evtl direkt das ergebnis einsetzt!!!
gruß Mike
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
09.03.2003, 11:33 Uhr
NemoEimi




Zitat:
Jetzt würde ich gern von euch wissen, wieviel Leistungseinbusen bei einem guten Parser normal sind gegenüber, der Leistung die ein compiliertes Programm ereicht bei dem der gleiche Term im Sourcecode einer Doublevariable zugewiesen wird.


Das sollte imho von der Rechnung abhängen, denn die Ausführungszeit der interpretierten Version ist gleich der Rechenzeit des Parsers plus der Rechenzeit der vom Parser aufgerufenen Routinen. Da die verschiedenen von Deinem Programm zur Verfügung gestellten Grundoperationen selbst verschiedene Laufzeiten haben werden (Wurzelziehen dauert länger als int-Addition...), ist dabei der Anteil des Parsers an der Rechenzeit keine von der Rechnung selbst unabhängige Konstante. Für Rechnungen, in denen nur die aus der Grundschule bekannten Operationen vorkommen und in denen primitive Datentypen benutzt werden dürfen, wird der Überhang aber erheblich sein...

Grüße,
NemoEimi

Dieser Post wurde am 09.03.2003 um 11:35 Uhr von NemoEimi editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
09.03.2003, 20:57 Uhr
Pablo
Supertux
(Operator)


Ich hab schon meine Seite aktuelisiert, da stand ein Fehler und ich hab ihn schon behoben. Hoffentlich beutzt du auch Linux
http://pcpool.mathematik.uni-freiburg.de/~pabloy/
--
A! Elbereth Gilthoniel!
silivren penna míriel
o menel aglar elenath,
Gilthoniel, A! Elbereth!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: