Qt扩展-muParser数学公式解析
muParser数学公式解析
- 一、概述
- 1. 针对速度进行了优化
- 2. 支持的运算符
- 3. 支持的函数
- 4. 用户定义的常量
- 5. 用户定义的变量
- 6. 自定义值识别回调
- 7. 其他功能
- 二、内置函数
- 三、内置二元运算符
- 四、三元运算符
- 五、内置常量
- 六、源码引入
- 1. 源码文件
- 2. 编译器开关
- 1. MUP_BASETYPE
- 2.MUP_USE_OPENMP
- 3. MUP_STRING_TYPE
- 七、实例
一、概述
muparser - Fast Math Parser Library
项目地址:https://beltoforion.de/en/muparser/features.php#idStart
muparser是一个高性能的数学计算表达式库,支持常用的函数、常用运算符、数学计算式的计算,这个库也提供了很多内置的功能、同时也开放了很多功能供用户使用。这个库使用的 C++语言、也可以用C语言搭配用、跨平台的支持

1. 针对速度进行了优化
- 高解析性能;批量模式提供了表达式计算的并行化
- 具有延迟计算的 If-Then-Else运算符
- 在一次求值中计算多个逗号分隔子表达式:sin(X),x+y,x*x
2. 支持的运算符
- 14个预定义运算符
- 二元运算符是用户可定义的
- 后缀运算符是用户可定义的
- 中缀运算符是用户可定义的
3. 支持的函数
- 25个预定义函数
- 具有最多五个参数的固定数量
- 具有可变数量的参数
- 使用单个字符串参数(用于数据库查询)
- 可以由用户扩展
4. 用户定义的常量
- 数值常量
- 字符串常量
5. 用户定义的变量
- 在数量上无限
- 可在解析器运行时由解析器定义:abc=123
- 根据其他变量赋值变量是可能的
6. 自定义值识别回调
- 我们可以定义值的外观
- 我们可以让muparser读取十六进制值,如a=0x00ff00或二进制值
- A=0b1000101
- 我们还可以使用此功能从数据库中查询值
7. 其他功能
- 使用后缀运算符作为单位乘数(3M->0.003)
- 内置函数,用于对给定变量进行数值求导
- 参数分隔符、小数分隔符、千位分隔符可以根据我们的区域设置进行调整
- 基于CMake的构建系统
- ISO 14882:符合2017年标准的代码
- 每种语言都可以使用的DLL版本能够使用以C风格导出的函数
二、内置函数
下表概述了默认实现支持的函数,它列出了函数名称、参数数量和简短说明
| 名称 | 参数个数 | 解释 |
|---|---|---|
| sin | 1 | 正弦函数 |
| cos | 1 | 余弦函数 |
| tan | 1 | 切线函数 |
| asin | 1 | 反正弦函数 |
| acos | 1 | 反余弦函数 |
| atan | 1 | 圆弧正切函数 |
| sinh | 1 | 双曲正弦函数 |
| cosh | 1 | 双曲余弦 |
| tanh | 1 | 双曲正切函数 |
| asinh | 1 | 双曲弧正弦函数 |
| acosh | 1 | 双曲圆弧正切函数 |
| atanh | 1 | 双曲反正切函数 |
| log2 | 1 | 以2为底的对数 |
| log10 | 1 | 以10为底的对数 |
| log | 1 | 以e为底的对数为1(2.71828…) |
| ln | 1 | 以e为底的1个对数(2.71828…) |
| exp | 1 | e的x次方 |
| sqrt | 1 | 平方根 |
| sign | 1 | 如果x<0,则符号1符号函数-1;如果x>0,则为1,阶跃函数 |
| rint | 1 | 舍入为最接近的整数 |
| abs | 1 | 绝对值 |
| min | var. | 最小变量所有参数中的最小值 |
| max | var. | 所有参数的最大值 |
| sum | var. | 和变量所有参数的总和 |
| avg | var. | 平均变量所有参数的平均值 |
三、内置二元运算符
下表列出了解析器支持的默认二进制运算符
| 操作符 | 描述 | 优先级 |
|---|---|---|
| = | 分配* | 0 |
| || | 逻辑或 | 1 |
| && | 逻辑AND | 2 |
| | | 按位或 | 3 |
| & | 按位和 | 4 |
| <= | 小于或等于 | 5 |
| >= | 大于或等于 | 5 |
| != | 不等于 | 5 |
| == | 等于 | 5 |
| > | 大于 | 5 |
| < | 小于 | 5 |
| + | 加法 | 6 |
| - | 减去 | 6 |
| * | 乘法 | 7 |
| / | 除法 | 7 |
| ^ | 将x乘以y的幂,幂运算符 | 8 |
- *赋值运算符是特殊的,因为它更改了它的一个参数,并且只能应用于变量
四、三元运算符
Muparser内置了对If Then Else运算符的支持
它使用惰性求值,以确保只计算表达式的必要分支
| 操作符 | 描述 | 备注 |
|---|---|---|
| ?: | If Then Else运算符 | C++样式语法 |
五、内置常量
预定义常量名称的名称以下划线为前缀
解析器有两个预定义的常量:Pi和Eulers Number
常量定义的准确性最终取决于所选值类型(浮点型、双精度型、双精度长整型)的大小
| 常量 | 描述 | 备注 |
|---|---|---|
| _pi | 唯一的圆周率 | 3.141592653589793238462643 |
| _e | 欧拉数 | 2.718281828459045235360287 |
六、源码引入
1. 源码文件
官方建议将muparser直接嵌入到项目中将库源代码直接嵌入到客户端应用程序中是避免链接器冲突的最简单方法,这些冲突源于共享解析器库和项目使用的运行时库的不同版本
为了嵌入muparser,将以下文件包括到我们的项目中:
muParser.cpp
muParserBase.cpp
muParserBytecode.cpp
muParserCallback.cpp
muParserError.cpp
muParserTokenReader.cpp
并确保在我们的项目包含路径中可以找到以下包含文件:
muParser.h
muParserBase.h
muParserBytecode.h
muParserCallback.h
muParserDef.h
muParserError.h
muParserFixes.h
muParserTemplateMagic
muParserToken.h
muParserTokenReader.h
解析器类和所有相关类驻留在命名空间 mu 中,请确保添加一个 using
using namespace mu;
添加到我们的文件中,或使用其完整名称引用所有类
2. 编译器开关
如果我们通过编译自己的版本或直接包含源代码来使用muParser,则可以使用一组预处理器定义来定制其行为
以下定义位于文件muParserDef.h中:
1. MUP_BASETYPE
宏 MUP_BASETYPE 定义muParser使用的底层数据类型这可以是任何浮点值类型(浮点型、双精度型或双精度长整型)宏默认为双精度,如果我们需要更高的精度或希望将muParser Seamless与使用Float作为其数据类型的客户端代码一起使用,请修改此值
#define MUP_BASETYPE double
2.MUP_USE_OPENMP
如果我们使用的是CMake构建系统,则使用-DENABLE_OPENMP=OFF/ON选项激活OpenMP支持
该选项将为我们设置宏MUP_USE_OPENMP,并自动链接到OpenMP,启用OpenMP支持时,批量模式下的表达式求值将在多个CPU上并行执行默认情况下,使用CMake构建时,OpenMP支持处于活动状态
#define MUP_USE_OPENMP
如果不是使用CMake构建,并且已将源代码直接嵌入到项目中,请取消对文件muParserDef.h中宏的注释
根据硬件的不同,并行化可以显著提高解析器的速度(30%-400%)
启用并行化对简短表达式没有显著影响
3. MUP_STRING_TYPE
这个定义决定了muParser使用的字符串类型,它可以是 std::string,也可以是 std::wstring,这个定义不应该直接设置
如果存在预处理器MACRO_UNICODE,则将其定义为 std::wstring
#define MUP_STRING_TYPE std::wstring
七、实例
#include "muParser.h"double fVal;
try
{double result = 0;// 定义对象mu::Parser m_parser;// 定义可能需要的变量double x_value = 7.434, y_value = 4.5, result;paser.DefineVar(L"x", &x_value);paser.DefineVar(L"y", &y_value);// 设置数学表达式m_parser.SetExpr("4.54534*(5.43-0.689*_pi)^2");// 计算result = m_parser.Eval();// 设置数学表达式m_parser.SetExpr(L"x^y+5.654-534.432^y");// 计算result = m_parser.Eval();return result;
}
catch (Parser::exception_type &e)
{std::cout << e.GetMsg() << endl;
}
更多就需要去其官网查看说明、配合着源代码一起使用。
相关文章:
Qt扩展-muParser数学公式解析
muParser数学公式解析 一、概述1. 针对速度进行了优化2. 支持的运算符3. 支持的函数4. 用户定义的常量5. 用户定义的变量6. 自定义值识别回调7. 其他功能 二、内置函数三、内置二元运算符四、三元运算符五、内置常量六、源码引入1. 源码文件2. 编译器开关1. MUP_BASETYPE2.MUP_…...
【Matplotlib】figure方法之图形的保存
🎈个人主页:甜美的江 🎉欢迎 👍点赞✍评论⭐收藏 🤗收录专栏:matplotlib 🤝希望本文对您有所裨益,如有不足之处,欢迎在评论区提出指正,让我们共同学习、交流进…...
数据库管理-第142期 DBA?DBA!(20240131)
数据库管理142期 2024-01-31 数据库管理-第142期 DBA?DBA!(20240131)正文总结 数据库管理-第142期 DBA?DBA!(20240131) 作者:胖头鱼的鱼缸(尹海文)…...
react 之 zustand
zustand可以说是redux的平替 官网地址:https://zustand-demo.pmnd.rs/ 1.安装 npm i zustand2.基础使用 // zustand import { create } from zustand// 1. 创建store // 语法容易出错 // 1. 函数参数必须返回一个对象 对象内部编写状态数据和方法 // 2. set是用来…...
leetcode-回文链表
234. 回文链表 在此对比的值,不是节点 # Definition for singly-linked list. # class ListNode: # def __init__(self, val0, nextNone): # self.val val # self.next next class Solution:def isPalindrome(self, head: Optional[ListNod…...
Pinia:一个Vue的状态管理库
Pinia的使用方法包括以下步骤: 安装Pinia:通过yarn或npm进行安装: yarn命令: yarn add pinianpm命令: npm install pinia创建根存储:在main.ts中引入Pinia插件,并创建一个根存储。这可以通过创建…...
2024 Flutter 重大更新,Dart 宏(Macros)编程开始支持,JSON 序列化有救
说起宏编程可能大家并不陌生,但是这对于 Flutter 和 Dart 开发者来说它一直是一个「遗憾」,这个「遗憾」体现在编辑过程的代码修改支持上,其中最典型的莫过于 Dart 的 JSON 序列化。 举个例子,目前 Dart 语言的 JSON 序列化高度依…...
云计算概述(云计算类型、技术驱动力、关键技术、特征、特点、通用点、架构层次)(二)
云计算概述(二) (云计算类型、技术驱动力、关键技术、特征、特点、通用点、架构层次) 目录 零、00时光宝盒 一、云计算类型(以服务的内容或形态来分) 二、云计算的12种技术驱动力 三、云计算的关键技术 四、云计…...
物流平台架构设计与实践
随着电商行业的迅猛发展,物流行业也得到了极大的发展。从最初的传统物流到现在的智慧物流,物流技术和模式也在不断的更新与升级。物流平台作为连接电商和物流的重要媒介,其架构设计和实践显得尤为重要。 一、物流平台架构设计 1. 前端架构设…...
RedHat8.4安装邮件服务器
一、配置发件服务器 1.1 根据现场IP,配置主机名 vim /etc/hosts 192.168.8.120 mail.test.com 将主机名更改为邮件服务器域名mail.test.com 1.2 关闭防火墙,禁止开机启动 systemctl stop firewalld systemctl disable firewalld 1.3 关闭selinux v…...
Linux Shell系列--dirname 去除基本文件名
一、目的 上一篇中我们介绍了basename命令的使用,本篇我们介绍dirname命令,dirname 命令与 basename 互补,它负责删除路径中的基本文件名部分(包括扩展名),只保留目录部分。 二、介绍 dirname首先去除字符…...
池化技术的总结
文章目录 1.什么是池化技术2.池化技术的应用一、连接池二、线程池三、内存池 3.池化技术的总结 1.什么是池化技术 池化技术指的是提前准备一些资源,在需要时可以重复使用这些预先准备的资源。 在系统开发过程中,我们经常会用到池化技术。通俗的讲&am…...
H5简约星空旋转引导页源码
H5简约星空旋转引导页源码 源码介绍:一款带有星空旋转背景特效的源码,带有四个按钮 下载地址: https://www.changyouzuhao.cn/11655.html...
前端学习之路(4) vue2和vue3的区别
一. 根节点不同 vue2中必须要有根标签vue3中可以没有根标签,会默认将多个根标签包裹在一个fragement虚拟标签中,有利于减少内存。 二. 组合式API和选项式API 在vue2中采用选项式API,将数据和函数集中起来处理,将功能点切割了当…...
网络原理-TCP/IP(5)
TCP协议 延迟应答 它也是基于滑动窗口,提高效率的一种机制,结合滑动窗口以及流量控制,能够以延迟应答ACK的方式,把反馈的窗口,搞大.核心在于允许范围内,让窗口尽可能大. 如果接收数据的主机立刻返回ACK应答,这时候返回的窗口可能比较小. 1.假设接收端缓冲区为1M.一次收到了5…...
Docker 常用命令详细介绍
Docker 是一个开源的应用容器引擎,它允许开发者打包他们的应用以及依赖包到一个可移植的容器中,然后发布到任何流行的 Linux 机器上,也可以实现虚拟化。容器是完全使用沙箱机制,相互之间不会有任何接口。Docker 使用概率最高的命令…...
10G PON演进到50G PON
10G-PON是万兆无源光网络,光纤链路传输速率能够达到10Gbps。根据ZTE的报告称,截至2023年6月,全球10G PON出货量已超过3000万个PON端口,其中中国市场份额约占80%。 10G PON在中国市场的广泛部署,显着推进了10G PON产业链…...
智能指针——浅析
智能指针 本人不才,只能将智能指针介绍一下,无法结合线程进行深入探索 介绍及作用 在异常产生进行跳转时,通过栈帧回收进行内存释放,防止内存泄漏 基于RAII思想可以创建出只能指针 RAII(Resource Acquisition Is Initializatio…...
JAVA后端上传图片至企微临时素材
1.使用场景 在使用企业微信API接口中,往往开发者需要使用自定义的资源,比如发送本地图片消息,设置通讯录自定义头像等。 为了实现同一资源文件,一次上传可以多次使用,这里提供了素材管理接口:以media_id来…...
MySQL-----初识
一 SQL的基本概述 基本概述 ▶SQL全称: Structured Query Language,是结构化查询语言,用于访问和处理数据库的标准的计算机语言。SQL语言1974年由Boyce和Chamberlin提出,并首先在IBM公司研制的关系数据库系统SystemR上实现。 ▶美国国家标…...
云原生玩法三问:构建自定义开发环境
云原生玩法三问:构建自定义开发环境 引言 临时运维一个古董项目,无文档,无环境,无交接人,俗称三无。 运行设备的环境老,本地环境版本高,ssh不过去。正好最近对 腾讯出品的云原生 cnb 感兴趣&…...
在QWebEngineView上实现鼠标、触摸等事件捕获的解决方案
这个问题我看其他博主也写了,要么要会员、要么写的乱七八糟。这里我整理一下,把问题说清楚并且给出代码,拿去用就行,照着葫芦画瓢。 问题 在继承QWebEngineView后,重写mousePressEvent或event函数无法捕获鼠标按下事…...
TSN交换机正在重构工业网络,PROFINET和EtherCAT会被取代吗?
在工业自动化持续演进的今天,通信网络的角色正变得愈发关键。 2025年6月6日,为期三天的华南国际工业博览会在深圳国际会展中心(宝安)圆满落幕。作为国内工业通信领域的技术型企业,光路科技(Fiberroad&…...
2.3 物理层设备
在这个视频中,我们要学习工作在物理层的两种网络设备,分别是中继器和集线器。首先来看中继器。在计算机网络中两个节点之间,需要通过物理传输媒体或者说物理传输介质进行连接。像同轴电缆、双绞线就是典型的传输介质,假设A节点要给…...
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南
在RK3588上搭建ROS1环境:创建节点与数据可视化实战指南 背景介绍完整操作步骤1. 创建Docker容器环境2. 验证GUI显示功能3. 安装ROS Noetic4. 配置环境变量5. 创建ROS节点(小球运动模拟)6. 配置RVIZ默认视图7. 创建启动脚本8. 运行可视化系统效果展示与交互技术解析ROS节点通…...
前端工具库lodash与lodash-es区别详解
lodash 和 lodash-es 是同一工具库的两个不同版本,核心功能完全一致,主要区别在于模块化格式和优化方式,适合不同的开发环境。以下是详细对比: 1. 模块化格式 lodash 使用 CommonJS 模块格式(require/module.exports&a…...
2025 后端自学UNIAPP【项目实战:旅游项目】7、景点详情页面【完结】
1、获取景点详情的请求【my_api.js】 // 引入公共的请求封装 import http from ./my_http.js// 登录接口(适配服务端返回 Token) export const login async (code, avatar) > {const res await http(/login/getWXSessionKey, {code,avatar}); };//…...
记一次spark在docker本地启动报错
1,背景 在docker中部署spark服务和调用spark服务的微服务,微服务之间通过fegin调用 2,问题,docker容器中服务器来后,注册中心都有,调用服务也正常,但是调用spark启动任务后报错,报错…...
【中间件】Web服务、消息队列、缓存与微服务治理:Nginx、Kafka、Redis、Nacos 详解
Nginx 是什么:高性能的HTTP和反向代理Web服务器。怎么用:通过配置文件定义代理规则、负载均衡、静态资源服务等。为什么用:提升Web服务性能、高并发处理、负载均衡和反向代理。优缺点:轻量高效,但动态处理能力较弱&am…...
暴雨新专利解决服务器噪音与性能悖论
6月1日,我国首部数据中心绿色化评价方面国家标准《绿色数据中心评价》正式实施,为我国数据中心的绿色低碳建设提供了明确指引。《评价》首次将噪音控制纳入国家级绿色评价体系,要求从设计隔声结构到运维定期监测实现闭环管控,加速…...
