2010-12-28 16 views
9

Qualcuno conosce un buon approccio/librerie per fare calcoli algebrici in C++?calcolo simbolico

Ho un'applicazione sviluppata in C++ che deve eseguire il calcolo algebrico. Per ora ho creato un parser C++ che accetta espressioni in forma di stringhe come "5 + (2 - MYFUNC (3))" che vengono tokenizzate in struct e poi convertite in notazione postfix usando l'algoritmo Shunting Yard e valutate.

Il MYFUNC in queste espressioni sono le mie funzioni definite che possono eseguire calcoli complessi.

tratta di un'applicazione ad alte prestazioni, le espressioni hanno anche variabili dinamicamente sostituiti con valori e l'espressione viene valutata

esempio var1 + (2 - MYFUNC (var2)) -> con var1 e var2 sostituiti da alcuni valori durante il corso della corsa e rivalutati

Sto usando Linux e finora ho trovato Giac library ma non sono sicuro che sia buono , qualsiasi commento sarebbe benvenuto.

In che modo le persone si avvicinano di solito a questo problema? La lingua principale in questo caso è C++.

risposta

2

Dai un'occhiata a Bison e Flex Parser. L'idea di base è che un file grammaticale verrà scritto e convertito in codice C che può essere integrato nell'applicazione dell'utente. Qualsiasi libro su Flex e Bison (http://www.amazon.com/Flex-Bison-Text-Processing-Tools/dp/0596155972) è abbastanza buono per la lettura iniziale.

Questo può essere d'aiuto.!

+0

Grazie, lo esaminerò. Avevo già intrapreso un percorso simile per cercare in Boost :: Spirit di creare una DSL per questo, ma sentivo che stava diventando eccessivo. Suona fin dai commenti finora che la funzione C compilata sarebbe una soluzione molto performante. Ho solo bisogno di trovare gli strumenti giusti. –

1

Probabilmente il modo più veloce per gestire ciò è generare una funzione compilata e ottimizzata in fase di esecuzione per la funzione definita e valutarla per i diversi valori di variabile che si possono avere. Puoi farlo con LLVM, probabilmente con altri strumenti.

+0

Sarebbe simile a come la regex può fare espressioni compilate per l'ottimizzazione? –

+0

C'è qualche somiglianza, ma a quanto ho capito, le regex sono compilate su una tabella che è più veloce da valutare. Con LLVM si compila fino al codice macchina, si torna a un puntatore a funzione da chiamare. È possibile creare una funzione per ogni set di valori variabili o, più probabilmente, passarli come parametro per questa funzione. – ergosys

+0

Ma dal momento che sia il programma C++ principale che la funzione LLVM verranno compilati, non ci sarà alcuna differenza nelle prestazioni. La stringa algebrica verrà analizzata e valutata allo stesso modo in entrambi i casi, no? –

0

Scriverò un parser di discesa ricorsiva per il linguaggio, perché la sintassi non sembra molto complessa. L'analisi può essere un po 'più lenta di quella di Flex/Bison, ma suppongo che il parsing sia il meno costoso dal punto di vista computazionale nel tuo progetto.