?? 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 + -