📄 compile_hss.pas
字号:
算符(函数)名称 书写格式和变量取值范围 例子(说明)
+ 加法 x+y 或者: Add(x,y) 3.5+5=8.5
- 减法 x-y 或者: Sub(x,y) 8-3=5
* 乘法 x*y 或者: Mul(x,y) 2*3=6
/ 除法 x/y 或者: Div(x,y) ; y<>0 3/2=1.5
\ 整除 x\y 或者: DivE(x,y) ; y<>0 25\10=2
Mod 求余 x Mod y 或者: x%y、Mod(x,y) ; y<>0 14 Mod 5=4
^ 指数 x^y 或者: Power(x,y)、x**y 2^3=8
; x<0时,y必须为整数
; x=0时,y>0
;比较运算产生的结果为逻辑值(真或假),即结果只可能为1或0
= 等于 x=y (2=3-1) =true =1
<> 不等于 x<>y (2<>3-1) =false =0
< 小于 x<y (2<3) =true
> 大于 x>y (2>3) =false
<= 小于等于 x<=y (sin(a)<=1) =true
>= 大于等于 x>=y (3>=PI) =false
;逻辑运算中 0表示 假(false),非0会被当作 真(true)来参加逻辑运算
;用大写X,Y表示逻辑值或实数(注意必须写扩号)
ADD 逻辑与 (X) ADD (Y) (1>2) AND (true)=false
OR 逻辑或 (X) OR (Y) (false) OR (true)=true
XOR 逻辑异或 (X) XOR (Y) (true) XOR (true)=false
NOT 逻辑非 NOT (X) NOT (1)=false
Max 最大值 Max(x,y) Max(3,4)=4
Min 最小值 Min(x,y) Min(3,4)=3
Sqr 平方 Sqr(x) Sqr(3)=9 //注意平方和开方的函数名称
Sqrt 开方 Sqrt(x) ; x>=0 Sqrt(3)=1.73205080756888
Exp 自然指数 Exp(x) Exp(2)=e*e=e^2
Ln 自然对数 Ln(x) ; x>0 Ln(e)=1
Log2 2的对数 Log2(x) ; x>0 Log2(8)=3
Log10 10的对数 Log10(x) 或者: Log(x) ; x>0 Log(100)=2
Abs 绝对值 Abs(x) Abs(-2)=2 ; Abs(2)=2
Rev 倒数 Rev(x) Rev(5)=1/5=0.2
Int 取整 Int(x) 或者: Floor(x) (不超过x的最大整数) Int(2.3)=2 ; Int(-2.3)=-3
Trunc 截断取整 Trunc(x) (向零取整) Trunc(2.3)=2 ; Trunc(-2.3)=-2
Round 四舍五入 Round(x) (四舍五入取整) Round(2.51)=3 ; Round(2.49)=2
Ceil 舍入取整 Ceil(x) (向正穷大取整) Ceil(-2.2)=-2 ; Ceil(2.8)=3
Sgn 符号函数 Sgn(x) Sgn(-2)=-1 ; Sgn(0)=0 ; Sgn(2)=1
Hypot 斜边 Hypot(x,y) Hypot(x,y)=Sqrt(x*x+y*y)
Random 随机函数 Random(x) 或者:RND(x)、Rand(x) Random(2.5)=2.5*a ,其中a为随机数0<=a<1
(要产生真正的随机数,而不是固定随机数序列,请在创建或编译完成后
取得表达式值之前调用一次TCopmile.SetRandomize();函数。)
Sin 正弦 Sin(x) Sin(pi/6)=0.5
Cos 余弦 Cos(x) Cos(0)=1
Tan 正切 Tan(x) 或者: tg(x) Tan(pi/4)=1
ArcSin 反正弦 ArcSin(x) ; -1<=x<=1 ArcSin(1)=1.5707963267949=pi/2
ArcCos 反余弦 ArcCos(x) ; -1<=x<=1 ArcCos(0)=1
ArcTan 反正切 ArcTan(x) 或者: Arctg(x) ArcTan(1)=0.785398163397448=pi/4
ArcTan2 反正切2 ArcTan2(y,x) 或者: Arctg2(y,x) ArcTan2(2,1)=1.10714871779409
;y为纵坐标、x为横坐标
Cot 余切 Cot(x) 或者: Ctg(x) ;x<>0 Cot(x)=1/Tan(x)
Sec 正割 Sec(x) Sec(x)=1/Cos(x)
Csc 余割 Csc(x) ;x<>0 Csc(x)=1/Sin(x)
ArcCot 反余切函数 ArcCot(x) 或者: ArcCtg(x) ;x<>0 ArcCtg(x)=ArcTan(1/X) //Delphi6 误为 ArcCtg(x)=Tan(1/X) !
ArcSec 反正割函数 ArcSec(x) ;|x|>=1 ArcSec(x)=ArcCos(1/X) //Delphi6 误为 ArcSec(x)=Cos(1/X) !
ArcCsc 反余割函数 ArcCsc(x) ;|x|>=1 ArcCsc(x)=ArcSin(1/X) //Delphi6 误为 ArcCsc(x)=Sin(1/X) !
SinH 双曲正弦 SinH(x) SinH(2)=3.62686040784702=(e^2-e^(-2))/2
CosH 双曲余弦 CosH(x) CosH(2)=3.76219569108363=(e^2+e^(-2))/2
TanH 双曲正切 TanH(x) 或者: tgH(x) TanH(2)=0.964027580075817=SinH(2)/CosH(2)
ArcSinH 反双曲正弦 ArcSinH(x) ArcSinH(3.62686040784702)=2
ArcCosH 反双曲余弦 ArcCosH(x) ; x>=1 ArcCosH(3.76219569108363)=2
ArcTanH 反双曲正切 ArcTanH(x) 或者: ArctgH(x) ArcTanH(0.761594155955765)=1
CotH 双曲余切 CotH(x) 或者: CtgH(x) ;x<>0 CotH(x)=1/TanH(x)
SecH 双曲正割 SecH(x) SecH(x)=1/CosH(x)
CscH 双曲余割 CscH(x) ;x<>0 CscH(x)=1/SinH(x)
ArcCotH 反双曲余切函数 ArcCotH(x) 或者: ArcCtgH(x) ;x<>0 ArcCtgH(x)=ArcTanH(1/X) //Delphi6 误为 ArcCotH(x)=1/ArcCot(X) !
ArcSecH 反双曲正割函数 ArcSecH(x) ;0<x<=1 ArcSecH(x)=ArcCosH(1/X) //Delphi6 误为 ArcSecH(x)=1/ArcSec(X) !
ArcCscH 反双曲余割函数 ArcCscH(x) ;x<>0 ArcCscH(x)=ArcSinH(1/X) //Delphi6 误为 ArcCscH(x)=1/ArcCsc(X) !
ff 定积分函数 ff(a,b,x,g(x)) 或者: ff(a,b,x,N,g(x)) ff(-1,1,y,Sqrt(1-y*y))=pi/2
( ff函数特别说明:
函数g(x)是关于'x'的表达式(也可以不含有变量x),这里的自变量x与本函数ff以外的x没有关系;
ff函数表示 对函数 g(x) 从 a 积到 b 积分,
x表示以x为积分变量对函数g(x)积分,
N (N>0) 表示 把积分区间分成 N 份来积 ,省略 N 时默认为 1000 ;
积分函数支持多重积分(较慢)
(注意: 多重积分和积分套嵌不是一个意思)
比如求单位球体的体积(R=1)
二重积分表达式为:
ff(-1,1,x, //x从-1到1积分
ff(-Sqrt(1-x*x),Sqrt(1-x*x),y, //y从-Sqrt(1-x*x)到sqrt(1-x*x)积分
2*Sqrt(1-x*x-y*y)
)
)
=4.18883330446894
=4*Pi/3
=ff(-1,1,x,PI*(1-x*x)) // (求单位球体体积的一重积分表达式)
)
10. 运算符优先级表:
由高到低
() (包括各种函数)
^
* \ / mod
+ -
= <> < > <= >=
(AND、OR、XOR NOT 可以看作函数)
*)
type TFunctionList =record
FName :string; //函数名称
FAddress :Pointer; //函数地址入口
FCCount :0..2; //函数所需参数个数
end;
type TParameterList =record
CName :String; //参数名称
CAddress :PExtended; //参数地址
CIndex :integer; //参数地址序号
IfConst :boolean; //是否为常数; false:变量 true:常数
end;
type TT_PTrue=record
ifConst :boolean; //编译优化常数时 参数性质 是否为常数
dValue :Extended; //编译优化常数时 参数性质 值
end;
type TExeAddressPMList=record
ExeIndex :integer; //插入ExeCode的当前位置序号
PMIndex :integer; //参数序号
end;
const ExendedFormatLength=16; //Extended类型(10字节)的存储长度, 设为16是为了数据对齐
////////////////////////////////////////////////////////////////////////////////
type
TCompile=class // <<数学函数动态编译器TCompile类>>
private {私有}
FEnabledNote :boolean;
procedure SetEnabledNote(Value:boolean);
public
//>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>//
// <<对外可见成员 即 接口部分>> //
//<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<//
//Enabled :boolean; // 是否有效
property EnabledNote: Boolean read FEnabledNote write SetEnabledNote default false;
//类的属性:是否允许使用注释
function SetText(const Value:string):boolean;
//设置需要编译的字符串Value
function GetText():string;
//获得当前编译的字符串
function GetValue():Extended;overload;
//返回表达式的值 。
Procedure GetValue(var x:Extended);overload;
//返回表达式的值 ,通过 x 返回。
function GetParameterAddress(const PName:string):PExtended;
//根据参数名称PName得到参数地址值
function SetParameter(const PName:string;const dValue:Extended):boolean;overload;
//按参数名称PName设置参数值dValue
procedure SetParameter(const PAddress:PExtended;const dValue:Extended);overload;
//按参数地址PAddress设置参数值dValue
function GetParameterValue(const PName:string):Extended;
//得到参数PName的值
Function GetParameterCount():integer;
//得到参数的总数目(包括常数)
procedure GetParameterList(var PList:array of TParameterList);
//通过PList返回参数列表
function IfHaveParameter(const PName:string):boolean;overload;
//测试参数PName是否已经存在
function IfHaveParameter(const dValue:Extended;var cName:string):boolean;overload;
//测试常数dValue是否已经存在 并通过cName返回常数名称
function GetError():string;
//返回错误描述
function GetErrorCode():integer;
//返回错误代码号
function GetErrorGB(const xErrorCode{错误代码号}:integer):string;overload;
//返回错误描述(中文简体) 要更改错误描述或翻译为其他语言时请改写此函数
function GetErrorBIG5(const xErrorCode:integer):string;overload;
//返回错误描述(中文繁体) 这是给的例子
function GetErrorEnglish(const xErrorCode:integer):string;overload;
//返回错误描述(英文) 这是给的例子,英语水平有限,希望有大虾更正:)
Function GetExeCodeLength():integer;
//返回编译以后的程序指令区代码长度(字节)
Function GetExeParameterLength():integer;
//返回编译以后的程序数据区代码长度(字节)
procedure SetRandomize();overload;
//设置随机函数Rnd()的初始种子值为完全随机种子(系统用当前精确到毫秒的时间设置)
procedure SetRandomize(const RandomSeed :integer);overload;
//设置随机函数Rnd()的初始种子值
private
{ Private declarations }
{私有数据}
FExeText :string; //表达式
ErrorCode :integer; //错误描述代码
RndSeed :array [0..1] of integer; //随机函数种子值
FunctionList :array [0..128-1] of TFunctionList; //函数列表,已经有60多个函数了(包括别名)
PFunctionList :integer; //当前函数信息插入函数列表位置
FunctionStack :array of string; //函数符号调用堆栈
PFunctionStack :integer; //函数符号调用堆栈 当前插入位置
ExeAddressCode :array of byte; //编译以后的执行码
PExeAddressCode :integer; //当前插入机器指令位置
ExeAddressList :array of integer; //记录指针位置列表(因为积分函数用到)
PExeAddressList :integer; //当前插入位置
ExeAddressPMList :array of TExeAddressPMList; //记录指针位置列表(因为参数存储地址用到)
PExeAddressPMList :integer; //当前插入位置
ExeAddressTempData :array [0..16*1024-1] of byte; //临时数据交换地址
ExeAddressStack :array [0..16*1024-1] of byte; //数据堆栈地址
ParameterList :array of TParameterList; //参数列表
PParameterList :integer; //保存参数列表当前插入位置
ExeParameter :array of byte; //编译后 参数储存空间
PExeParameter :integer; //编译后 参数地址 ,当前分配参数位置
//PExeParameterList:=@ExeParameter[PExeParameter]
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -