C++ 在C++;?

C++ 在C++;?,c++,math,expression,C++,Math,Expression,例如,计算任何自定义数学表达式的最佳方法是什么 3+sqrt(5)+pow(3)+log(5) 我知道把Python嵌入C++中可以做到这一点;还有更好的办法吗 谢谢是C++解析器库。< /P> 示例: 在其分发中:版本和版本(查找“calc”) 上 有些人正在使用它 >P>我编写了一个简单的、易于使用的前端LUA,用于从C(和C++当然)评估算术表达式。看见另请参见和格式化如下字符串: #include <boost/lexical_cast.hpp> #include &l

例如,计算任何自定义数学表达式的最佳方法是什么

3+sqrt(5)+pow(3)+log(5)

我知道把Python嵌入C++中可以做到这一点;还有更好的办法吗


谢谢如果你想要一些好的解析算法的参考,考虑查看第14章的表达式解析(在线免费和可用!),或者考虑查看。这里提到的两种算法都很容易实现,并且可以让您相对轻松地计算表达式

如果你感兴趣的是一些用于评估表达式的硬核心工具,请考虑查看这些工具,这些工具可以为这些类型的表达式构建强大的解析器。我相信,

bison
文档甚至向您展示了如何解析和计算算术表达式,因此您可能已经完成了您的工作

希望这有帮助

< P>是C++解析器库。< /P> 示例:

  • 在其分发中:版本和版本(查找“calc”)
  • 有些人正在使用它

  • >P>我编写了一个简单的、易于使用的前端LUA,用于从C(和C++当然)评估算术表达式。看见另请参见和格式化如下字符串:

    #include <boost/lexical_cast.hpp>
    #include <string>
    #include <math.h>
    
    extern "C" {
    std::string evaluate() { return boost::lexical_cast<std::string>(3+sqrt(5)+pow(3)+log(5)); }
    }
    
    #包括
    #包括
    #包括
    外部“C”{
    std::string evaluate(){return boost::lexical_cast(3+sqrt(5)+pow(3)+log(5));}
    }
    

    调用C++编译器将上述代码编译成共享库。然后加载共享库,解析
    的地址,计算
    ,调用它并获得结果。

    下面是为Boost Spirit的最新版本编写的方法:

    我在C++和java开发了一个。目前,它们只处理算术运算符+.-,/*但没有理由不能扩展它们以容纳更多功能

    这些简单的示例使用调车场算法将表达式转换为反向波兰符号,然后使用另一个简单的基于堆栈的算法实际计算表达式


    代码样本。

    是另一个C++数学表达式解析器。

    是另一个C++库,可以做到这一点。除了解析和计算表达式之外,它还具有一些更高级的功能。例如,它可以计算解析导数,可以对表达式进行一些基本的代数简化。这个库非常小,而且是开源的(MIT许可)。

    在搜索库时,我发现了一个类似的任务。这似乎是一件合适的事情。不幸的是,GPL对我来说是不可接受的。

    不确定为什么“pow”只有一个参数,但使用库可以得出以下简单的解决方案:

    #include <cstdio>
    #include <string>
    #include "exprtk.hpp"
    
    int main()
    {
       typedef exprtk::expression<double> expression_t;
       typedef exprtk::parser<double>         parser_t;
    
       std::string expression_string = "3 + sqrt(5) + pow(3,2) + log(5)";
    
       expression_t expression;
    
       parser_t parser;
    
       if (parser.compile(expression_string,expression))
       {
         double result = expression.value();
    
         printf("Result: %19.15\n",result);
       }
       else
         printf("Error in expression\n.");
    
       return 0;
    }
    
    #包括
    #包括
    #包括“exprtk.hpp”
    int main()
    {
    typedef exprtk::expression\t;
    typedef exprtk::parser\t;
    std::string表达式_string=“3+sqrt(5)+pow(3,2)+log(5)”;
    表达;
    语法分析器;
    if(parser.compile(表达式\字符串,表达式))
    {
    双重结果=表达式.value();
    printf(“结果:%19.15\n”,结果);
    }
    其他的
    printf(“表达式中的错误\n.”);
    返回0;
    }
    
    最简单的方法是使用外部库。我找到的最简单的方法是。它是用C编写的,所以从C++调用应该很容易。而且,它只有一个源文件和一个头文件。非常容易集成。你可以得到它

    解决您的示例问题只需:

    #include "tinyexpr.h"
    #include <stdio.h>
    
    int main(int argc, char *argv[])
    {
        printf("Result: %f\n", te_interp("3+sqrt(5)+pow(3,2)+log(5)", 0));
        return 0;
    }
    
    #包括“tinyexpr.h”
    #包括
    int main(int argc,char*argv[])
    {
    printf(“结果:%f\n”,teu interp(“3+sqrt(5)+pow(3,2)+log(5)”,0));
    返回0;
    }
    

    我知道将Python嵌入C++中可以做到


    <>你可以这样做,但是你会拉一个巨大的依赖来解决一个简单的问题。

    无关,但是感谢C++中编程抽象的技巧。1代表振奋精神。然而,您的示例指向1.8,它与以后的版本有很大的不同(解析现在发生在boost::spirit::qi中)@Tristram–您是对的。我从发行版链接到当前版本,但其他两个链接仅适用于经典版本。为什么将结果强制转换为字符串?您需要将其强制转换为其他内容,因为表达式生成的结果类型未知,为字符串或双精度。可能是的重复项