Bibliothek zur mathematischen Auswertung

Ich suche eine C/C++-Bibliothek, die mathematische Ausdrücke auswertet und ausführt. Python wäre ein guter Anfang, aber da C-Python oder PyPy eine GIL haben, ist dies keine Lösung. Clang hätte funktioniert, da es sehr schnell ist und sogar native Prozessoranweisungen erstellt, aber einen ganzen Compiler nur für dieses Ziel zu verwenden, ist meiner Meinung nach zu viel.

Anforderungen:

  • Kann mathematische Ausdrücke auswerten
  • Funktioniert in Multithread-Umgebungen
  • Erzeugt Jitted-Ausgabe ( optional )

Jeder Vorschlag ist willkommen

Welche Art von mathematischen Ausdrücken möchten Sie unterstützen? Pythons "eval" ist nicht wirklich für mathematische Operationen gedacht, es führt nur Python-Code inline aus. Ich denke, Sie sollten sich die SageMath C/C++-Bibliotheksschnittstellen ansehen , um herauszufinden, welche Software/Bibliotheken Sie sich ansehen sollten.
Ich stimme zu, und eval ist zu "böse". Danke für den Vorschlag!

Antworten (1)

Ich kenne drei Bibliotheken für diese Aufgabe. Ziemlich sicher, dass keiner von denen JIT macht.

  • GNU-Libmatheval

    Verwendet einen Parser, der auf yacc und bison basiert. Kann einfache mathematische Ausdrücke mit wenigen vordefinierten Funktionen und Symbolen auswerten. Ist eine C-Bibliothek, die kompiliert und gelinkt werden muss. Lizenz: GPL

    #include <cassert>
    #include <iostream>
    #include <string>
    
    #include <matheval.h>
    
    int main() {
        std::string expr = "1+x";
        char *buf = const_cast<char*>(expr.c_str());
    
        void *f = evaluator_create (buf);
        assert(f);
    
        int x = 1;
        std::cout << evaluator_evaluate_x (f, x) << '\n';
    }
    
  • Booste Matheval

    Verwendet Boost.Spirit und Boost.Fusion zum Analysieren und Auswerten. Hat Unterstützung für alle mathematischen Standardbibliotheksfunktionen von C++11. Definiert einige Konstanten. Nur-Header-Vorlagenbibliothek für einzelne Dateien, erfordert C++11, die Kompilierzeit liegt aufgrund von Boost.Spirit in der Größenordnung von Sekunden. Lizenz: Boost. (Haftungsausschluss: Ich bin der Autor)

    #include <iostream>
    #include <string>
    
    #include <matheval.hpp>
    
    int main() {
        std::string expr = "1+x";
        matheval::Parser<double> parser;
        parser.parse(expr);
        std::cout << parser.evaluate({std::make_pair("x",1)}) << '\n';
        // // or even simpler
        // matheval::parse<double>(expr,{std::make_pair("x",1)})
    }
    
  • ExprTk

    Ein wahres Monster mit fast 40000 Zeilen in einer einzigen Header-Datei. Es implementiert eine vollständige Zustandsmaschine, die Dinge wie logische Operationen, Kontrollstrukturen und sogar Datei-IO enthält. Die Kompilierungszeit ist sogar länger als bei Boost Matheval.

    #include <iostream>
    #include <string>
    
    #include <exprtk.hpp>
    
    int main() {
        std::string expr = "1+x";
    
        double x = 1;
        exprtk::symbol_table<double> symbol_table;
        symbol_table.add_variable("x",x);
    
        exprtk::expression<double> expression;
        expression.register_symbol_table(symbol_table);
    
        exprtk::parser<double> parser;
        parser.compile(expr,expression);
    
        std::cout << expression.value() << '\n';
    }
    

Wenn Sie mehr als nur mathematische Ausdrücke benötigen, ziehen Sie in Betracht, eine Erweiterungssprache in Ihr Programm einzubetten, z. B. Lua (für das es LuaJIT gibt).