网站地图怎么设置,注册实名认证,百度手机网页版,小程序设计开发muParser数学公式解析 一、概述1. 针对速度进行了优化2. 支持的运算符3. 支持的函数4. 用户定义的常量5. 用户定义的变量6. 自定义值识别回调7. 其他功能 二、内置函数三、内置二元运算符四、三元运算符五、内置常量六、源码引入1. 源码文件2. 编译器开关1. MUP_BASETYPE2.MUP_… muParser数学公式解析 一、概述1. 针对速度进行了优化2. 支持的运算符3. 支持的函数4. 用户定义的常量5. 用户定义的变量6. 自定义值识别回调7. 其他功能 二、内置函数三、内置二元运算符四、三元运算符五、内置常量六、源码引入1. 源码文件2. 编译器开关1. MUP_BASETYPE2.MUP_USE_OPENMP3. 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)xyx*x
2. 支持的运算符
14个预定义运算符二元运算符是用户可定义的后缀运算符是用户可定义的中缀运算符是用户可定义的
3. 支持的函数
25个预定义函数具有最多五个参数的固定数量具有可变数量的参数使用单个字符串参数(用于数据库查询)可以由用户扩展
4. 用户定义的常量
数值常量字符串常量
5. 用户定义的变量
在数量上无限可在解析器运行时由解析器定义abc123根据其他变量赋值变量是可能的
6. 自定义值识别回调
我们可以定义值的外观我们可以让muparser读取十六进制值如a0x00ff00或二进制值A0b1000101我们还可以使用此功能从数据库中查询值
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如果x0则符号1符号函数-1如果x0则为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 double2.MUP_USE_OPENMP
如果我们使用的是CMake构建系统则使用-DENABLE_OPENMPOFF/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.hdouble fVal;
try
{double result 0;// 定义对象mu::Parser m_parser;// 定义可能需要的变量double x_value 7.434, y_value 4.5, result;paser.DefineVar(Lx, x_value);paser.DefineVar(Ly, y_value);// 设置数学表达式m_parser.SetExpr(4.54534*(5.43-0.689*_pi)^2);// 计算result m_parser.Eval();// 设置数学表达式m_parser.SetExpr(Lx^y5.654-534.432^y);// 计算result m_parser.Eval();return result;
}
catch (Parser::exception_type e)
{std::cout e.GetMsg() endl;
}更多就需要去其官网查看说明、配合着源代码一起使用。