2010-12-28 2 views
9

Est-ce que quelqu'un connaît une bonne approche/libs pour faire des calculs algébriques en C++?calcul symbolique

J'ai une application en cours de développement en C++ qui a besoin de faire un calcul algébrique. Pour l'instant je construis un analyseur C++ qui accepte des expressions sous forme de chaînes comme "5 + (2 - MYFUNC (3))" qui se transforme en structures et qui est ensuite converti en notation postfixée en utilisant l'algorithme Shunt Yard et évalué. MYFUNC dans ces expressions sont mes propres fonctions définies qui peuvent effectuer des calculs complexes.

Ceci est une application de haute performance, les expressions ont aussi des variables qui sont dynamiquement remplacées par des valeurs et l'expression est réévalué

par exemple var1 + (2 - MYFUNC (var2)) -> avec var1 et var2 remplacées par quelques valeurs au cours de la course et réévaluées

J'utilise Linux et j'ai trouvé Giac library mais je ne sais pas si c'est bon , Tous les commentaires seraient les bienvenus.

Comment les gens abordent-ils généralement ce problème? La langue principale dans ce cas est C++.

Répondre

2

Jetez un oeil sur Bison et Flex Parser. L'idée de base ici est qu'un fichier de grammaire serait écrit et converti en code C qui peut être intégré dans votre application. Tout livre sur Flex et Bison (http://www.amazon.com/Flex-Bison-Text-Processing-Tools/dp/0596155972) est assez bon pour la lecture initiale.

Cela peut vous aider.!

+0

Merci, je vais y jeter un coup d'oeil. J'étais déjà sur le même chemin en regardant Boost :: Spirit pour créer une DSL pour cela mais je sentais que ça devenait exagéré. Il semble que des commentaires jusqu'à présent que la fonction C compilé serait une solution très performante. Juste besoin de trouver les bons outils. –

1

Probablement le moyen le plus rapide de gérer ceci est de générer une fonction compilée et optimisée au moment de l'exécution pour la fonction définie, et de l'évaluer pour les différentes valeurs de variables que vous pourriez avoir. Vous pouvez le faire avec LLVM, probablement d'autres outils.

+0

Serait-ce similaire à la façon dont regex peut faire des expressions compilées pour l'optimisation? –

+0

Il y a une certaine similitude, mais si je comprends bien, les regex sont compilés jusqu'à une table qui est plus rapide à évaluer. Avec LLVM, vous compileriez le code machine, vous obtiendrez un pointeur de fonction à appeler. Vous pouvez créer une fonction pour chaque ensemble de valeurs de variables ou, plus probablement, les transmettre en tant que paramètre à cette fonction. – ergosys

+0

Mais puisque le programme principal C++ et la fonction LLVM seront compilés, il n'y aura pas vraiment de différence de performance. La chaîne algébrique sera analysée et évaluée de la même manière dans les deux cas, non? –

0

J'écrirais un analyseur de descente récursif pour le langage, car la syntaxe ne semble pas très complexe. L'analyse syntaxique peut être un peu plus lente que celle de Flex/Bison, mais je suppose que l'analyse sera la moins chère du point de vue informatique dans votre projet.