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++中可以做到这一点;还有更好的办法吗
谢谢在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–您是对的。我从发行版链接到当前版本,但其他两个链接仅适用于经典版本。为什么将结果强制转换为字符串?您需要将其强制转换为其他内容,因为表达式生成的结果类型未知,为字符串或双精度。可能是的重复项