⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 compile_hss.pas

📁 一个多元非线性回归分析源码以及其中的公式列表
💻 PAS
📖 第 1 页 / 共 3 页
字号:

       算符(函数)名称       书写格式和变量取值范围                       例子(说明)

       +        加法        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 + -