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

news/2025/2/1 2:04:09/

一、简介

        之前写了一篇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 double、MPFR/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;
}


http://www.ppmy.cn/news/2639.html

相关文章

Tomcat的安装和运行

安装Tomcat 安装某一个软件,我们当然是要去官网.为了防止很多朋友找不到资源,我们这里直接放出官网路径. https://tomcat.apache.org/download-80.cgi 直接点击进入官网下载页面即可.选择Tomcat8,点击Core的zip包下载即可. 下载好以后,我们进入到下载的目录.选择到 我们下载…

DataLoader,DataSet和Sampler

DataLoader、DataSet和Sampler之间的关系 Sample和DataSet是DataLoader的两个子模块。Sampler的功能主要是生成索引。也就是样本的序号。 DatasetDatasetDataset是根据索引去读取数据以及对应的标签。DataLoader负责以特定的方式从数据集中迭代的产生一个一个batchbatchbatch集…

黑马程序员14套经典IT教程+面试宝典

很多同学对互联网比较感兴趣 &#xff0c;奈何苦恼不知道如何入门。今天免费给大家分享一波&#xff0c;黑马程序员14套经典IT教程程序员面试宝典&#xff01;涉及Java、前端、Python、大数据、软件测试、UI设计、新媒体短视频等。从厌学到学嗨&#xff0c;你只差一套黑马教程&…

如何自定义SpringBoot中的starter,并且使用它

目录 1 简介 2 规范 2.1 命名 2.2 模块划分 3 示例 1 简介 SpringBoot中的starter是一种非常重要的机制&#xff0c;能够抛弃以前繁琐的配置&#xff0c;将其统一集成进starter&#xff0c;应用者只需要在maven中引入starter依赖&#xff0c;SpringBoot就自动扫描到要加载…

Java线程实现

内容引用自《深入理解Java虚拟机&#xff1a;JVM高级特性与最佳实践&#xff08;第3版&#xff09;周志明》 线程的实现 我们知道&#xff0c;线程是比进程更轻量级的调度执行单位&#xff0c;线程的引入&#xff0c;可以把一个进程的资源分配和 执行调度分开&#xff0c;各个…

大学电子系C++模拟考试

随手附上一些代码&#xff0c;未必是最优解&#xff0c;仅供参考。 加密四位数 【问题描述】 输入一个四位数&#xff0c;将其加密后输出。方法是将该数每一位的数字加9&#xff0c;然后除以10取余作为该位上的新数字&#xff0c;最后将千位上的数字和十位上的数字互换&#…

Hbase和Mysql存储数据量对比

目录 前言 生成数据 转换成hbase能够识别的HFile文件 导入HFile到hbase中 导入数据到Mysql 总结 前言 由于想知道hbase和mysql存储同样的一份数据需要的存储是否一样&#xff0c;故做的一下实验。 生成数据 脚本如下&#xff1a; #!/bin/basharray_brand([1]huawei […

C语言第二十课:实用调试技巧

目录 前言&#xff1a; 一、Bug&#xff1a; 二、调试&#xff1a; 1.调试是什么&#xff1a; 2.调试的基本步骤&#xff1a; 3. Debug 与 Release &#xff1a; 三、在Windows环境下进行调试&#xff1a; 1.调试环境的准备&#xff1a; 2.调试的快捷键&#xff1a; 3.调试…