繁体   English   中英

数学表达式求值程序的简单库或实现

[英]Simple library or implementation for a mathematical expression evaluator

我有一个只包含一行的文本文件,该行只包含一个数学表达式,例如12+(3.0 *(4)-1)/ sqrt(121)

我的程序需要将此express表示为字符串,然后给出结果
13

是否有任何简单的方法或第三方dll / lib来实现这一目标?

评论增加:

评估一串简单的数学表达式

这里是解决方案,但许多解决方案只包含+ - / *,我需要尽可能多的运营商,如天花板方形平方根和功率()

所以这个链接可能是最好的解决方案
http://www.codeproject.com/KB/recipes/sota_expression_evaluator.aspx

使用ExprTk库可以轻松获得以下简单的解决方案:

#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 = "12 + (3.0 * (4) - 1) / sqrt(121)";

   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;
}

.NET解决方案:

这里有几个关于SO的主题:


还有两个我已经使用过的项目:

C#: NCalc - .NET的数学表达式计算器

NCalc是.NET中的数学表达式求值器。 NCalc可以解析任何表达式并评估结果,包括静态或动态参数和自定义函数。


VB.NET: 快速轻量级表达式评估器

Flee是.NET框架的表达式解析器和评估器。 它允许您在运行时计算字符串表达式的值,例如sqrt(a ^ 2 + b ^ 2)。 它使用自定义编译器,强类型表达式语言和轻量级codegen将表达式直接编译为IL。 这意味着表达式评估非常快速有效。 试试演示 ,它可以让你根据表情生成图像,并亲自看看。

您可以将它与C#一起使用,因为它无论如何都是.NET(通过程序集引用)。

对于C等人来说,这是一个需要Perl的快速且非常不安全的作弊:

double eval(const char* expr) {
    char buf[1024];
    snprintf(buf, sizeof(buf), "perl -e 'print (%s)'", expr);
    FILE* p = popen(buf, "r");
    double d;
    fscanf(p, "%lf", &d);
    fclose(p);
    return d;
}

UNIX编程环境中 ,我认为是,开发了一个名为hoc (IIRC)的简单计算器。 可能它的源代码几乎可以在任何地方使用。

干杯&hth。,

我考虑嵌入lua 它快速,轻便且安全。它专为嵌入而设计。 被许多游戏用作他们的脚本语言。 (IMO比python或perl更容易嵌入)

这是一个完整的例子,展示它是多么微不足道

extern "C"
{
  #include "lua.h"
  #include "lauxlib.h"
  #include "lualib.h"
}

#include <string>
#include <iostream>

int main()
{
   std::string expression = "12+(3.0*(4)-1)/math.sqrt(121)";
   lua_State * L = lua_open();
   luaopen_math(L);
   if( luaL_dostring(L, ("return "+expression).c_str()) != 0 )
   {
      std::cout<<"ERROR : "<<lua_tostring(L,-1)<<std::endl;
   }
   if( lua_type(L,-1) == LUA_TNUMBER )
   {
      std::cout<<"GOT "<<lua_tonumber(L,-1)<<std::endl;
   }
   lua_close(L);
}

如果你想要勇敢的源代码,你可以随时查看bc 它可以为您处理所有Lex / Yacc的优点。 如果你想要一个纯粹的C ++解决方案,你可以尝试使用Boost Spirit进行编码。

对于c ++,请尝试muParser:

muParser - 一个快速的数学解析器库

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM