C++数学表达式库(ExprTk)

一、简介

        之前写了一篇c++ 调用python的方式实现表达式计算 ,但在项目应用中发现单线程没问题,多个线程时偶尔会闪退崩溃。后面发现了一个C++代码编写的表达式计算工具ExprTK, 也能同样满足需求,在此分享给大家。c++数学表达式库(ExprTk)是一个使用简单,易于集成和运行极其高效的数学表达式解析器和求值引擎。ExprTk支持多种形式的函数式、逻辑和向量处理语义,并且非常容易扩展。

ExprTK原文地址:http://www.partow.net/programming/exprtk/index.html

下载地址 http://www.partow.net/downloads/exprtk.zip

二、功能

ExprTk 库具有以下功能:

  • 数学运算符 :(+, -, *, /, %, ^)

  • 函数min, max, avg, sum, abs, ceil, floor, round, roundn, exp, log, log10, logn, pow, root, sqrt, clamp, inrange, swap

  • 三角函数(sin, cos, tan, acos, asin, atan, atan2, cosh, cot, csc, sec, sinh, tanh, d2r, r2d, d2g, g2d, hyp)

  • 平等与不平等 (=, ==, <>, !=, <, <=, >, >=)

  • 赋值 (:=, +=, -=, *=, /=, %=)

  • 逻辑运算符(and, nand, nor, not, or, xor, xnor, mand, mor)

  • 控制结构(if-then-else、三目运算、switch case、返回语句)

  • 循环结构(while循环,for循环,repeat until loop, break, continue

  • 表达式优化(常数折叠、强度降低、运算符耦合、特殊函数和死代码消除)

  • 字符串操作(等式、不等式、逻辑运算符、连接和子范围)

  • 表达式局部变量、向量和字符串

  • 用户定义的变量、向量、字符串、常量和函数支持

  • 多元函数组合

  • 支持多序列点和子表达式

  • 数字积分和微分

  • 向量处理:BLAS-L1 (axpy, axpby, axpb), all/any-true/false,计数,左/右旋转,左/右移位,排序,nth_element, iota, sum, kahan-sum,点积,复制

  • 文件- io包(例程包括:open, close, read, write, getline,支持二进制和文本模式)

  • 支持各种数值类型float, double, long doubleMPFR/GMP

  • 只有单个头文件实现,不需要构建。没有外部依赖。

  • 完全可移植(编译和执行:x86 x86-64,ARMv7 / 8,POWER6 / 7和AVR32)

三、使用示例

环境:qt creator + msvc2015

新建一个qt工程,添加exprtk.hpp文件,只需要在您的源代码中包含“exprtk.hpp”即可

此时会编译失败,提示如下:

xxx\exprtk.hpp(15376) : fatal error C1128: 节数超过对象文件格式限制: 请使用 /bigobj 进行编译

在pro文件中添加一句话即可,重新qmake一下

win32:QMAKE_CXXFLAGS += /bigobj

示例代码如下:

#include <QDebug>
#include <cstdio>
#include <string>
#include "exprtk.hpp"

typedef exprtk::symbol_table<double> symbol_table_t;
typedef exprtk::expression<double>   expression_t;
typedef exprtk::parser<double>       parser_t;

double evalcpp(const QString &expr)
{
    expression_t expression;
    parser_t parser;
    parser.compile(expr.toStdString(), expression);

    double val = expression.value();
    return val;
}

int main()
{
    qDebug() << evalcpp("1+1");
    return 0;
}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Jason~shen

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值