数学表达式计算函数库
使用说明
User Guide Of EvalExpr_DLL
Ver1.4.04
Copyright (C) NEAU Tan KaiShuai Inc.
一、概要
欢迎使用:数学表达式计算函数库(EvalExpr.dll)
(原名:字符串表达式解释计算动态连接库)
这是本人自学了<数据结构>和<编译原理>后开发的工具,当前版本:V1.4.04。
最初作为一个实用的文本字符串解释器,可以帮助程序开发人员快速地整合到自己的应
用程序之中。随着版本的不断升级,功能也越发完善,现已包含字符串解释、数学计算、内
存块操作、动态编连等相关操作总计一百三十几个导出函数,主要用于实现高级语言之间的
动态解释计算与调用。例如对 VB 的不能实现的相关功能做了较大的扩充。
本函数库仿照 MathTools 公司的 MatCom 与 MathWorks 公司的 MatLab 制作开发,相信
对于数值计算与混合编程的各位程序爱好者与开发人员有所帮助。
目前最终版本为:V1.4.04,其主要特点有:
[1]在以前版本的基础上有较大的算法改动,导出实现接口得以加强,能够非常方便地
在原有基础上加以扩充。并且修正了原有版本的许多 BUG,计算精度大大提高。
[2]支持整数、正负数、浮点数混合运算。
对于浮点数可以使用如下科学计数形式:<num1>e<num2>
如:-2e-3
[3]支持近三十种基本算术运算符,按照优先级排列如下:
All Buildin Kernel Operators Function
! -> Logic Not(逻辑非)
~ -> Bit Not(按位反)
? -> Pos -> Also +(取正)
_ -> Neg -> Also –(取负)
^ -> Pow(幂)
' -> <num1>e<num2> -> Also e(指数输入)
* -> Mul(乘)
/ -> Div(除)
\ -> Int Div(整除)
% -> Mod(模)
+ -> Plus(加)
- -> Minus(减)
[ -> Bit Left Shift -> Also <<(按位左移)
] -> Bit Right Shift -> Also >>(按位右移)
& -> Bit And(按位与)
| -> Bit Or(按位或)
: -> Bit Xor(按位异或)
< -> lt(小于)
> -> gt(大于)
{ -> le -> Also <=(小于等于)
} -> ge -> Also >=(大于等于)
# -> ne -> Also != -> Also <>(不等于)
= -> eq -> Also ==(等于)
@ -> Logic And -> Also &&(逻辑与)
" -> Logic Or -> Also ||(逻辑或)
, -> semi -> For Call Function Like atan(x,y)(函数调用分隔符)
这些运算符与标准 C/C++基本一致,只有异或(:)除外,同时兼顾其他高级语言,如 VB
中幂(^)、等于(=)、不等于(<>)。同时各个运算符还有其相应的函数形式。
[注]较低版本中对于其他没有实现的运算只能通过函数调用实现,如:
and not or xor equ imp if
lt le gt ge ne eq neg
bitand bitnot bitor bitxor bitequ bitimp bitshift 等、
[4]支持丰富的内建库函数,如下所示:
All Buildin Kernel Function For Eval Function
//and
//or
//xor
//equ
//imp
//not
//pos
//neg
//mul
//div
//mod_rem
//modf
//add
//sub
//eq
//ne
//lt
//le
//gt
//ge
//abs_fabs
//fix
//floor
//ceil
//int_round
//min -> Param Number Form 2->4
//max -> Param Number Form 2->4
//gcd -> Param Number Form 2->4
//lcm -> Param Number Form 2->4
//set -> Set A New Or An Old Varable With Value
//get -> Get A Varable For Its Value
//del -> Free All Varables -> System Automatic Done
//fact
//if -> Param Number ==3 As if(cond,true_val,false_val)
//bitand
//bitor
//bitxor
//bitnot
//bitequ
//bitimp
//bitshift
//time
//rand_rnd
//sign_sgn
//sin
//cos
//tan_tg
//cot
//sec
//csc
//asin_arcsin
//acos_arccos
//atan_arctan -> Param Number Form 1->2
//acot_arccot
//asec_arcsec
//acsc_arccsc
//lg -> Base == 10
//ln_log -> Base == e
//lb -> Base == 2
//exp
//frexp
//pow -> Param Number Form 1->2
//sqrt_sqr -> Param Number Form 1->2
//sinh_sh
//cosh_ch
//tanh_th
//coth_cth
//sech
//csch
//asinh_ash
//acosh_ach
//atanh_ath
//acoth_acth
//asech
//acsch
//cat -> Concat Num As String
//disp -> Show As A Dialog
//ver -> Show Version Info Dialog As ver(true_val)
各函数名与标准 C/C++和 MatLab 中的同名函数一致,在此不加赘述。
[注]这些函数并不是以导出函数的形式给出,因而只能通过 strfunc、callstrfunc 实现间
接调用,这两个函数的声明如下:
int strfunc(const char *func,double *x);
int callstrfunc(const char *func,double *x,int len,double *val);
由于 strfunc 函数是 evalexpr 的函数计算核心,况且其调用参数比较复杂,因而不推荐
使用。使用 callstrfunc 调用示例如下:
Double x[]={2.0,1.0};
Double retval=0.0;
Callstrfunc(“atan”,x,2,&retval);
[注]事实上,各种运算符同样可以象这样动态调用,使用:strop、callstrop:
int strop(double *a,char op,double *b);
int callstrop(double *a,const char *op,double *b,double *val);
同样地,strop 是 evalexpr 的运算计算核心,调用参数比较复杂,尽量使用 callstrop:
Double a=2.0,b=1.0;
Double retval=0.0;
Callstrop(&a,”<=^=,=”,&b,&retval);
//Same As: retval= ((((a<=b)^b)==b)==b);
[5]表达式括号匹配的自动识别与优化扩展。例如: