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风格导出的函数

二、内置函数

下表概述了默认实现支持的函数,它列出了函数名称、参数数量和简短说明

名称参数个数解释
sin1正弦函数
cos1余弦函数
tan1切线函数
asin1反正弦函数
acos1反余弦函数
atan1圆弧正切函数
sinh1双曲正弦函数
cosh1双曲余弦
tanh1双曲正切函数
asinh1双曲弧正弦函数
acosh1双曲圆弧正切函数
atanh1双曲反正切函数
log21以2为底的对数
log101以10为底的对数
log1以e为底的对数为1(2.71828…)
ln1以e为底的1个对数(2.71828…)
exp1e的x次方
sqrt1平方根
sign1如果x<0,则符号1符号函数-1;如果x>0,则为1,阶跃函数
rint1舍入为最接近的整数
abs1绝对值
minvar.最小变量所有参数中的最小值
maxvar.所有参数的最大值
sumvar.和变量所有参数的总和
avgvar.平均变量所有参数的平均值

三、内置二元运算符

下表列出了解析器支持的默认二进制运算符

操作符描述优先级
=分配*0
||逻辑或1
&&逻辑AND2
|按位或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;
}

更多就需要去其官网查看说明、配合着源代码一起使用。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/362495.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

机器学习-3降低损失(Reducing Loss)

机器学习-3降低损失(Reducing Loss) 学习内容来自&#xff1a;谷歌ai学习 https://developers.google.cn/machine-learning/crash-course/framing/check-your-understanding?hlzh-cn 本文作为学习记录1.降低损失&#xff1a;迭代方法 迭代学习 下图展示了机器学习算法用于训…

[嵌入式系统-7]:龙芯1B 开发学习套件 -4- LoongIDE 集成开发工具的使用-创建应用程序工程、编译、下载、调试

目录 前言&#xff1a; 步骤1&#xff1a;设置工作工作空间 步骤2&#xff1a;设置工具链 步骤3&#xff1a;创建裸机应用程序 步骤4&#xff1a;创建带实时操作系统的应用程序 步骤5&#xff1a;编译 步骤6&#xff1a;下载调试 前言&#xff1a; LoongIDE集成开发环境…

075:vue+mapbox 利用高德地址逆转换,点击地图,弹出地址信息

第075个 点击查看专栏目录 本示例的目的是介绍演示如何在vue+mapbox中利用高德逆地理编码,点击地图,弹出某点坐标和地址信息。这里要仔细阅读高德地图的逆编码API,同时要注意的是,这种转换在中国很好用,到了欧美国家就不好使了。同时这个底图是天地图的图像和标记。 直接…

第三篇:跨平台QT开发-打包

&#xff08;1&#xff09;设置应用程序图标 https://www.bitbug.net/---->可以做图标 准备好 login.ico 文件&#xff0c;ExamSys.pro 文件中添加如下一行的代码 RC_ICONS login.ico-->图标的名字 找到项目运行的目录把图标拷贝进去(并将项目设置为release模式) 一定要…

将java对象转换为json字符串的几种常用方法

目录 1.关于json 2.实现方式 1.Gson 2.jackson 3.fastjson 3.与前端的联系 1.关于json JSON是一种轻量级的数据交换格式。它由Douglas Crockford在2001年创造。JSON的全称是JavaScript Object Notation&#xff0c;它是一种文本格式&#xff0c;可以轻松地在各种平台之间传…

正则表达式及文本处理三剑客(grep、sed、awk)

目录 一、正则表达式 1、正则表达式的概述 1.1 正则表达式的概念和作用 1.2 正则表达式支持的语言 1.3 正则表达式的优缺点 1.4 正则表达式的分类 1.4.1 基本正则表达式&#xff08;BRE&#xff09;&#xff1a; 1.4.2 扩展正则表达式&#xff08;ERE&#xff09;&…

回归预测 | Matlab实现CPO-GRU【24年新算法】冠豪猪优化门控循环单元多变量回归预测

回归预测 | Matlab实现CPO-GRU【24年新算法】冠豪猪优化门控循环单元多变量回归预测 目录 回归预测 | Matlab实现CPO-GRU【24年新算法】冠豪猪优化门控循环单元多变量回归预测效果一览基本介绍程序设计参考资料 效果一览 基本介绍 1.Matlab实现CPO-GRU【24年新算法】冠豪猪优化…

HiveSQL题——数据炸裂和数据合并

目录 一、数据炸裂 0 问题描述 1 数据准备 2 数据分析 3 小结 二、数据合并 0 问题描述 1 数据准备 2 数据分析 3 小结 一、数据炸裂 0 问题描述 如何将字符串1-5,16,11-13,9" 扩展成 "1,2,3,4,5,16,11,12,13,9" 且顺序不变。 1 数据准备 with da…

springboot144基于mvc的高校办公室行政事务管理系统设计与实现

简介 【毕设源码推荐 javaweb 项目】基于springbootvue 的 适用于计算机类毕业设计&#xff0c;课程设计参考与学习用途。仅供学习参考&#xff0c; 不得用于商业或者非法用途&#xff0c;否则&#xff0c;一切后果请用户自负。 看运行截图看 第五章 第四章 获取资料方式 **项…

如何编写具有完备性的测试用例 ? 具体思路是什么 ? 全套解决方案打包呈现给你 。

设计测试用例应该算是测试人员最为主要的工作之一 &#xff0c;好的测试用例往往具有覆盖性强 &#xff0c;扩展性高以及复用性好等特点 。该如何设计出好的测试用例 &#xff1f;是我们每一位测试人员需要重点思考的问题 &#xff0c;下面是我对设计测试用例设计的思考 &#…

全国疫情实时监测系统(附源码)

目录 一.项目背景 1.有力支持疫情防控知识传播 2.迅速锁定“涉疫”人员流动轨迹 3.开展疫情发展态势预测与溯源 4.一图胜过千言万语&#xff01;&#xff01;&#xff01; 二.研究过程&#xff08;项目技术的利用&#xff09; 1.总述 2.所用技术介绍 2.1Python 2.2Pyt…

从零开始学Linux之gcc命令

首先我们需要知道有两种编程语言 编译型语言&#xff1a;要求必须提前将所有源代码一次性转换成二进制指令&#xff0c;也就是生成一个可执行程序&#xff0c;例如C、C、go语言、汇编语言等&#xff0c;使用的转换工具称为编译器。 解释型语言&#xff1a;一边执行一边转换&a…

解析电子名片二维码生成:便捷、灵活、个性化

在当今信息爆炸的时代&#xff0c;名片已经成为商务社交不可或缺的工具之一。然而&#xff0c;随着技术的不断发展&#xff0c;传统的纸质名片已经逐渐被电子名片生成二维码所取代。电子名片二维码不仅具备了传统名片的基本信息展示功能&#xff0c;更融合了数字化优势&#xf…

记一次java项目本地正常执行,打完包之后执行发现没有对应的类或配置的问题

1、起因 线上有个spark的任务出了问题&#xff08;该任务是通过sparkstreaming读取kafka中的数据&#xff0c;处理完之后推到es中&#xff09;&#xff0c;问题出在kafka中数据是有更新的&#xff0c;但是es中的对应索引中的数据却只更新到月初&#xff0c;因此我需要排查处理…

IDEA 取消参数名称提示、IDEA如何去掉变量类型提醒

一、IDEA 取消参数名称显示 取消显示形参名提示 例如这样的提示信息 二、解决方法 1、File—>Setting–>Editor—>Inlay Hints—>Java 去掉 Show Parameter hints for 前面的勾即可&#xff0c;然后Apply—>Ok 2、右键Disable Hints

爬虫学习笔记-Cookie登录古诗文网

1.导包请求 import requests 2.获取古诗文网登录接口 url https://so.gushiwen.cn/user/login.aspxfromhttp%3a%2f%2fso.gushiwen.cn%2fuser%2fcollect.aspx # 请求头 headers {User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like …

自定义注解实现记录日志功能(注解支持SpEL表达式)

一、首先创建个接口类Log import java.lang.annotation.*;/*** description: 自定义操作日志记录注解* author xizc**/ Target({ ElementType.PARAMETER, ElementType.TYPE, ElementType.METHOD }) Retention(RetentionPolicy.RUNTIME) Inherited Documented public interface …

JUnit

前言&#xff1a;自动化就是selenium脚本来实现的&#xff0c;JUnit是java的单元测试工具&#xff0c;只不过我们在实现自动化的时候需要借助一下JUnit库里面提供的一些方法。 1、Test Test &#xff1a;表示方法是测试方法&#xff0c;执行当前这个类的时候&#xff0c;会自动…

Unity之做一个最简单的FPS游戏demo

目录 &#x1f60b;FPS游戏Demo &#x1f4a4;1.新建FPS模板项目 ⚒️2.装备枪 &#x1f4a3;3.设置射击功能 &#x1f4fa;4.制造一个子弹预制体 &#x1f3ae;5.发射子弹 说起来小编学Unity差不多一个月了&#xff0c;都是利用上班摸鱼时间学的&#xff08;doge.jpg&…

java+springboot校园体育场地预约预订使用系统vue+ssm

研究内容和研究方法 1.研究内容 网站主要包括管理员和用户两个部分&#xff0c;用户可以登录与注册自己的基本信息、查询哪些场地可以使用、提前预约场地、取消预约的场地、使用完场地后进行缴费。管理员可以审批用户的注册信息、对用户信息进行增删改查、查询场地的使用情况、…