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

📄 complex_hss.pas

📁 编译类_Hss VC版_源代码支持表达式的编译执行,速度超快,支持实数和复数,并附带一个复数函数库你还可以同时找到VB和VC版和Delphi版
💻 PAS
📖 第 1 页 / 共 5 页
字号:
unit Complex_Hss;

          /////////////////////////////////////////////////////////
          //                                                     //
          //     复数函数库  作者:侯思松   2001.12-2002.11      //
          //                                                     //
          //   有改进意见或发现任何错误请转告我,本人不胜感激    //
          //            E-Mail:HouSisong@263.net                //
          //           (   转载时请保留本说明:)  )               //
          //                                                     //     
          /////////////////////////////////////////////////////////

interface

uses SysUtils;

  //更新列表
  {

     2003.3.29 错误更正:C_Power ,Error!!!  sqr(sqr(Z1.y)) => sqr(Z1.y);
     2003.3.29 保证复数精度 设置为 Cmx_Extended 扩展精度 时,不论系统的边界对齐方式设置怎样,
               复数类型TComplex都占用32字节


  }

  //////////////////////////////////////////////////////////////////////////////
  //定义运算中使用的浮点数精度,请按使用要求设置
  //  可选择的标志:Cmx_Extended 扩展精度,Cmx_Double 双精度,Cmx_Single 单精度

  {$DEFINE Cmx_Extended} //默认运算中使用扩展精度Extended浮点数

  //  如果一定要同时使用不同的精度,请复制文件并修改精度标志
  //////////////////////////////////////////////////////////////////////////////

  {$IFDEF Cmx_Extended}
    type CmxFloat=Extended;   //扩展精度
    const FloatByte = 16; //Extended实际使用为10Byte,但为了数据8字节对齐,所以这里为16
  {$ENDIF}
  {$IFDEF Cmx_Double}
    type CmxFloat=Double;     //双精度
    const FloatByte = 8;
  {$ENDIF}
  {$IFDEF Cmx_Single}
    type CmxFloat=Single;     //单精度
    const FloatByte = 4;
  {$ENDIF}

  {定义复数类型}
  {$IFDEF Cmx_Extended}
  {$ALIGN 8}
  {$ENDIF}
  type TComplex=record   {复数类型}
      x   : CmxFloat;        {实部}
      y   : CmxFloat;        {虚部}
  end;

  type PTComplex=^TComplex;

  type
    PTComplexArray = ^TTComplexArray;
    TTComplexArray = array[0..32767] of TComplex;

  //============================================================================
  {定义函数}
  {
    函数名称规范: "C_" 为前缀,表示复数 ;"V" 为后缀,表示迅速(不一定速度快);
                  一般情况下: x,y表示实数,s表示字符串,N表示整数;
                  复数Z1,Z2表示函数的参数,复数Z表示函数返回值;
                  参数Error表示误差,参数K表示求复数角度时加上"2*K*PI",
                  tmp*表示临时变量.                                 }

  {复数转换函数}
  Function  CreateTComplex  (const x:CmxFloat;const y:CmxFloat):TComplex;overload;          {Z:=x+y*i}
  Function  CreateTComplex  (const x:CmxFloat):TComplex;overload;                           {Z:=x+0*i}
  Function  CreateTComplexR (const R:CmxFloat;const Arg:CmxFloat):TComplex;                 {Z:=r*e^(Arg*i)}
  function  GetTComplex_R   (const Z1:TComplex):CmxFloat;                                   {R:=|Z1|=(Z1.x*Z1.x+Z1.y*Z1.y)^0.5}
  Procedure GetTComplex_RV  (var Z1:TComplex);                                              {Z1.x:=|Z1|,Z1.y:=0}
  function  GetTComplex_Arg (const Z1:TComplex):CmxFloat;                                   {Arg:=Arctg(Z.y/Z.x),(-PI~PI)}
  Procedure GetTComplex_ArgV(var Z1:TComplex);                                              {Arg:=Arctg(Z.y/Z.x)}
  function  TComplexToStr   (const Z1:TComplex):string;                                     {TComplex => string , ( Str:='x+y*i' (简略) 默认 }
  function  TComplexToStri  (const Z1:TComplex):string;                                     {TComplex => string , ( Str:='x+y*i' ) }
  function  TComplexToStrBK (const Z1:TComplex):string;                                     {TComplex => string , ( Str:='(x,y)' }
  Function  StrToTComplex   (const Str:string;var Value:TComplex):boolean;                  {string => TComplex , ( Str:='x+y*i') 严格的语法格式检查 默认 }
  function  StrToTComplexi  (const Str:string):TComplex;                                    {string => TComplex , ( Str:='(x,y)' or Str:='x+y*i') }
  function  TComplexX       (const x:CmxFloat):TComplex;                                    {CmxFloat => TComplex,Z.x:=x,Z.y:=0}
  function  TComplexY       (const y:CmxFloat):TComplex;                                    {CmxFloat => TComplex,Z.y:=y,Z.x:=0}
  function  C_FromPolar     (const Z:TComplex):TComplex;                                    {极坐标到复数}
  Procedure C_FromPolarV    (var Z:TComplex);                                               {极坐标到复数}
  function  C_ToPolar       (const Z:TComplex):TComplex;                                    {复数到极坐标}
  Procedure C_ToPolarV      (var Z:TComplex);                                               {复数到极坐标}

  {复数函数_加减}
  function  C_Add           (const Z1:TComplex;const Z2:TComplex):TComplex;overload;        {Z:=Z1+Z2}
  Procedure C_AddV          (var Z1:TComplex;const Z2:TComplex);overload;                   {Z1:=Z1+Z2}
  function  C_Add           (const Z1:TComplex;const x:CmxFloat):TComplex;overload;         {Z:=Z1+x}
  Procedure C_AddV          (var Z1:TComplex;const x:CmxFloat);overload;                    {Z1:=Z1+x}
  function  C_Sub           (const Z1:TComplex;const Z2:TComplex):TComplex;overload;        {Z:=Z1-Z2}
  Procedure C_SubV          (var Z1: TComplex; const Z2:TComplex);overload;                 {Z1:=Z1-Z2}
  function  C_Sub           (const Z1:TComplex;const x:CmxFloat):TComplex;overload;         {Z:=Z1-x}
  Procedure C_SubV          (var Z1: TComplex; const x:CmxFloat);overload;                  {Z1:=Z1-x}

  {复数函数_乘除}
  Function  C_Mul           (const Z1:TComplex;const Z2: TComplex): TComplex;overload;      {Z:=Z1*Z2}
  Procedure C_MulV          (var Z1: TComplex; const Z2: TComplex);overload;                {Z1:=Z1*Z2}
  Function  C_Mul           (const Z1: TComplex;const x: CmxFloat): TComplex;overload;      {Z:=Z1*x}
  Procedure C_MulV          (var Z1: TComplex; const x: CmxFloat);overload;                 {Z1:=Z1*x}
  Function  C_Div           (const Z1: TComplex;const Z2:TComplex): TComplex;overload;      {Z:=Z1/Z2}
  Procedure C_DivV          (var Z1: TComplex; const Z2: TComplex);overload;                {Z1:=Z1/Z2}
  Function  C_Div           (const Z1: TComplex;const x: CmxFloat): TComplex;overload;      {Z:=Z1/x}
  Procedure C_DivV          (var Z1: TComplex; const x: CmxFloat);overload;                 {Z1:=Z1/x}

  {复数绝对值、取整、距离函数}
  Function  C_Abs           (const Z1: TComplex): TComplex;                                 {Z:=|Z1|  绝对值}
  Procedure C_AbsV          (var Z1: TComplex);                                             {Z1:=|Z1|}
  function  C_AbsSqr        (const Z:TComplex):TComplex;                                    {Z:=|Z1|^2}
  Procedure C_AbsSqrV       (var Z:TComplex);                                               {Z1:=|Z1|^2}
  Function  C_AbsA          (const Z1: TComplex): TComplex;                                 {Z.x:=abs(Z1.x);Z.y:=abs(Z1.y)}
  Procedure C_AbsAV         (var Z1: TComplex);                                             {Z1.x:=abs(Z1.x);Z1.y:=abs(Z1.y)}
  function  C_Distance      (const Z1:TComplex;const Z2: TComplex):TComplex;overload;       {Z.x:=|Z1-Z2|,Z.y:=0}
  Procedure C_DistanceV     (var Z1:TComplex;const Z2: TComplex);overload;                  {Z1.x:=|Z1-Z2|,Z1.y:=0}
  Function  C_Floor         (const Z1: TComplex): TComplex;                                 {Z:=Floor(Z1)}    {取整,小于x的最大整数}
  Procedure C_FloorV        (var Z1: TComplex);                                             {Z1:=Floor(Z1)}   {取整,小于x的最大整数}
  Function  C_Ceil          (const Z1: TComplex): TComplex;                                 {Z:=Ceil(Z1)}     {取整,大于x的最小整数}
  Procedure C_CeilV         (var Z1: TComplex);                                             {Z1:=Ceil(Z1)}    {取整,大于x的最小整数}
  Function  C_Trunc         (const Z1: TComplex): TComplex;                                 {Z:=Trunc(Z1)}    {向零取整,即截断}
  Procedure C_TruncV        (var Z1: TComplex);                                             {Z1:=Trunc(Z1)}   {向零取整,即截断}
  Function  C_Round         (const Z1: TComplex): TComplex;                                 {Z:=Round(Z1)}    {四舍五入到整数}
  Procedure C_RoundV        (var Z1: TComplex);                                             {Z1:=Round(Z1)}   {四舍五入到整数}
                            
  Function  C_IsEqual       (const Z1,Z2: TComplex):boolean;Overload;                       {是否相等}
  Function  C_IsEqual       (const Z1,Z2:TComplex;const Error:CmxFloat=0):boolean;Overload; {是否相等}
  Function  C_IsImag        (const Z1: TComplex ):boolean;Overload;                         {是否是纯虚数}
  Function  C_IsImag        (const Z1: TComplex;const Error:CmxFloat=0):boolean;Overload;   {是否是纯虚数}                      {是否是纯虚数}
  Function  C_IsZero        (const Z1: TComplex ):boolean;Overload;                         {是否是零}
  Function  C_IsZero        (const Z1: TComplex;const Error:CmxFloat=0):boolean;Overload;   {是否是零}                      {是否是纯虚数}


  {得零、单位虚数、归一化、共轭、虚实交换、倒数 、求符号、交换值}
  Function  C_Zero          ():TComplex;                                                    {Z:=0}   {得零}
  Procedure C_ZeroV         (var Z1: TComplex);                                             {Z1:=0}   {得零}
  Function  C_Imag1         ():TComplex;                                                    {Z.y:=1,Z.x:=0}  {得1}
  Procedure C_Imag1V        (var Z1: TComplex);                                             {Z1.y:=1,Z1.x:=0} {得1}
  Function  C_Unity         (const Z1: TComplex): TComplex;                                 {Z:=Z1/|Z1|}    {归一化 }
  Procedure C_UnityV        (var Z1: TComplex);                                             {Z1:=Z1/|Z1|}    {归一化 }
  Function  C_Conj          (const Z1: TComplex): TComplex;                                 {Z.x:=Z1.x; Z.y:=-Z1.y}  {共轭}
  Procedure C_ConjV         (var Z1: TComplex);                                             {Z1.y:=-Z1.y}            {共轭}
  Function  C_Flip          (const Z1: TComplex): TComplex;                                 {Z.x:=Z1.y; Z.y:=Z1.x}      {虚实交换}
  Procedure C_FlipV         (var Z1: TComplex);                                             {Z1.x:=Z1.y; Z1.y:=Z1.x}    {虚实交换}
  Function  C_Rev           (const Z1: TComplex): TComplex;                                 {Z:=1/Z1}       {倒数}
  Procedure C_RevV          (var Z1: TComplex);                                             {Z1:=1/Z1}       {倒数}
  Function  C_Chs           (const Z1: TComplex): TComplex;                                 {Z:=-Z1}       {求负}
  Procedure C_ChsV          (var Z1: TComplex);                                             {Z1:=-Z1}       {求负}
  Function  C_Rev2          (const Z1: TComplex;const Z2: TComplex): TComplex;              {Z:=1/(Z1-Z2)}     {倒数}
  Procedure C_Rev2V         (var Z1: TComplex;  const Z2: TComplex);                        {Z1:=1/(Z1-Z2)}     {倒数}
  function  C_Sgn           (const Z1: TComplex):TComplex;                                  {Z:=Sgn(Z1)}      {求符号}
  Procedure C_SgnV          (var Z1: TComplex);                                             {Z1:=Sgn(Z1)}     {求符号}
  Procedure C_Xchg          (var Z1: TComplex;var Z2: TComplex);Overload;                   {Z1<=>Z2)}        {交换值}
  Procedure C_Xchg          (var Z1: TComplex);Overload;                                    {Z1.x<=>Z1.y)}    {交换值}

  function  C_Max           (const Z1:TComplex;const Z2:TComplex):TComplex; overload;       {返回复数绝对值最大的复数}
  function  C_Min           (const Z1:TComplex;const Z2:TComplex):TComplex; overload;       {返回复数绝对值最小的复数}
  function  C_MaxX          (const Z1:TComplex;const Z2:TComplex):TComplex; overload;       {返回实部值最大的复数}
  function  C_MinX          (const Z1:TComplex;const Z2:TComplex):TComplex; overload;       {返回实部值最小的复数}


  {复数次方}
  Function  C_Sqr           (const Z1: TComplex): TComplex;                                             {Z:=Z1*Z1}   {平方}
  Procedure C_SqrV          (var Z1: TComplex);                                                         {Z1:=Z1*Z1}  {平方}
  Function  C_Sqr3          (const Z1: TComplex): TComplex;                                             {Z:=Z1^3}    {立方}
  Procedure C_Sqr3V         (var Z1: TComplex);                                                         {Z1:=Z1^3}   {立方}
  Function  C_Sqr4          (const Z1: TComplex): TComplex;                                             {Z:=Z1^4}    {四次方}
  Procedure C_Sqr4V         (var Z1: TComplex);                                                         {Z1:=Z1^4}   {四次方}
  Function  C_Power         (const Z1:TComplex;const Z2:TComplex;const K:integer=0):TComplex;overload;  {Z:=Z1^Z2}
  Procedure C_PowerV        (var Z1: TComplex; const Z2: TComplex;const K:integer=0);overload;          {Z1:=Z1^Z2}
  Function  C_Power         (const Z1:TComplex;const x:CmxFloat;const K:integer=0): TComplex;overload;  {Z:=Z1^x}
  Procedure C_PowerV        (var Z1: TComplex; const x: CmxFloat;const K:integer=0);overload;           {Z1:=Z1^x}
  Function  C_Power         (const xBase: CmxFloat;const Z1: TComplex): TComplex;overload;              {Z:=x^Z1}
  Procedure C_PowerV        (const xBase: CmxFloat;var Z1: TComplex);overload;                          {Z1:=x^Z1}
                                                                                                        
  Function  C_Exp           (const Z1: TComplex): TComplex;                                             {Z:=Exp(Z1)} {e^Z1}
  Procedure C_ExpV          (var Z1: TComplex);                                                         {Z1:=Exp(Z1)}
                                                                                                        
  Function  C_Sqrt          (const Z1:TComplex;const K:integer=0):TComplex;overload;                    {Z:=Sqrt(Z1)}
  Procedure C_SqrtV         (var Z1:TComplex;const K:integer=0);                                        {Z1:=Sqrt(Z1)}
  Procedure C_Sqrt          (const Z1:TComplex;var Z:array of TComplex);overload;                       {Z(i):=Sqrt(Z1)}
  Function  C_SqrtN         (const Z1:TComplex;const N:CmxFloat;const K:integer=0):TComplex;overload;   {Z:=Z1^(1/N)}
  Procedure C_SqrtNV        (var Z1:TComplex;const N:CmxFloat;const K:integer=0);                       {Z1:=Z1^(1/N)}
  Procedure C_SqrtN         (const Z1:TComplex;const N:integer;var Z:array of TComplex);overload;       {Z(i):=Z1^(1/N)}
                                                                                                        
  {复数对数}                                                                                            
  Function  C_Ln            (const Z1: TComplex;const K:integer=0): TComplex;                           {Z:=Ln(Z1)}
  Procedure C_LnV           (var Z1: TComplex;const K:integer=0);                                       {Z1:=Ln(Z1)}
  Function  C_Log2          (const Z1: TComplex;const K:integer=0): TComplex;                           {Z:=Log2(Z1)}
  Procedure C_Log2V         (var Z1: TComplex;const K:integer=0);                                       {Z1:=Log2(Z1)}
  Function  C_Log10         (const Z1: TComplex;const K:integer=0): TComplex;                           {Z:=Log10(Z1)}
  Procedure C_Log10V        (var Z1: TComplex;const K:integer=0);                                       {Z1:=Log10(Z1)}
  Function  C_LogN          (const NBase:CmxFloat;const Z1:TComplex;const K:integer=0):TComplex;        {Z:=LogN(Z1)=Ln(Z1)/Ln(N)}
  Procedure C_LogNV         (const NBase:CmxFloat;var Z1: TComplex;const K:integer=0);                  {Z1:=LogN(Z1)}
                                                                                                        
  {复数三角函数}
  Function  C_Sin           (const Z1: TComplex): TComplex;           {Z:=Sin(Z1)}
  Procedure C_SinV          (var Z1: TComplex);                       {Z1:=Sin(Z1)}
  Function  C_Cos           (const Z1: TComplex): TComplex;           {Z:=Cos(Z1)}
  Procedure C_CosV          (var Z1: TComplex);                       {Z1:=Cos(Z1)}
  Function  C_Tan           (const Z1: TComplex): TComplex;           {Z:=Tan(Z1)}
  Procedure C_TanV          (var Z1: TComplex);                       {Z1:=Tan(Z1)}
  Function  C_Cot           (const Z1: TComplex): TComplex;           {Z:=Cotan(Z1) => 1/tan(Z1)}
  Procedure C_CotV          (var Z1: TComplex);                       {Z1:=Cotan(Z1)}
  Function  C_Csc           (const Z1: TComplex): TComplex;           {Z:=Csc(Z1) => 1/sin(Z1)}
  Procedure C_CscV          (var Z1: TComplex);                       {Z1:=Csc(Z1)}
  Function  C_Sec           (const Z1: TComplex): TComplex;           {Z:=Sec(Z1) => 1/Cos(Z1)}
  Procedure C_SecV          (var Z1: TComplex);                       {Z1:=Sec(Z1)}
                            
  Function  C_SinH          (const Z1: TComplex): TComplex;           {Z:=SinH(Z1)}
  Procedure C_SinHV         (var Z1: TComplex);                       {Z1:=SinH(Z1)}
  Function  C_CosH          (const Z1: TComplex): TComplex;           {Z:=CosH(Z1)}
  Procedure C_CosHV         (var Z1: TComplex);                       {Z1:=CosH(Z1)}
  Function  C_TanH          (const Z1: TComplex): TComplex;           {Z:=TanH(Z1)}
  Procedure C_TanHV         (var Z1: TComplex);                       {Z1:=TanH(Z1)}
  Function  C_CotH          (const Z1: TComplex): TComplex;           {Z:=CotanH(Z1)}
  Procedure C_CotHV         (var Z1: TComplex);                       {Z1:=CotanH(Z1)}
  Function  C_CscH          (const Z1: TComplex): TComplex;           {Z:=CscH(Z1) => 1/sinH(Z1)}
  Procedure C_CscHV         (var Z1: TComplex);                       {Z1:=CscH(Z1)}
  Function  C_SecH          (const Z1: TComplex): TComplex;           {Z:=SecH(Z1) => 1/CosH(Z1)}
  Procedure C_SecHV         (var Z1: TComplex);                       {Z1:=SecH(Z1)}
                            
  Function  C_ArcSin        (const Z1: TComplex): TComplex;           {Z:=ArcSin(Z1)}
  Procedure C_ArcSinV       (var Z1: TComplex);                       {Z1:=ArcSin(Z1)}
  Function  C_ArcCos        (const Z1: TComplex): TComplex;           {Z:=ArcCos(Z1)}
  Procedure C_ArcCosV       (var Z1: TComplex);                       {Z1:=ArcCos(Z1)}
  Function  C_ArcTan        (const Z1: TComplex): TComplex;           {Z:=ArcTan(Z1)}
  Procedure C_ArcTanV       (var Z1: TComplex);                       {Z1:=ArcTan(Z1)}
  Function  C_ArcCsc        (const Z1: TComplex): TComplex;           {Z:=ArcCsc(Z1)}
  Procedure C_ArcCscV       (var Z1: TComplex);                       {Z1:=ArcCsc(Z1)}
  Function  C_ArcSec        (const Z1: TComplex): TComplex;           {Z:=ArcSec(Z1)}
  Procedure C_ArcSecV       (var Z1: TComplex);                       {Z1:=ArcSec(Z1)}
  Function  C_ArcCot        (const Z1: TComplex): TComplex;           {Z:=ArcCot(Z1)}
  Procedure C_ArcCotV       (var Z1: TComplex);                       {Z1:=ArcCot(Z1)}
                                                                      
  Function  C_ArcSinH       (const Z1: TComplex): TComplex;           {Z:=ArcSinH(Z1)}
  Procedure C_ArcSinHV      (var Z1: TComplex);                       {Z1:=ArcSinH(Z1)}
  Function  C_ArcCosH       (const Z1: TComplex): TComplex;           {Z:=ArcCosH(Z1)}
  Procedure C_ArcCosHV      (var Z1: TComplex);                       {Z1:=ArcCosH(Z1)}
  Function  C_ArcTanH       (const Z1: TComplex): TComplex;           {Z:=ArcTanH(Z1)}
  Procedure C_ArcTanHV      (var Z1: TComplex);                       {Z1:=ArcTanH(Z1)}
  Function  C_ArcCscH       (const Z1: TComplex): TComplex;           {Z:=ArcCscH(Z1)}
  Procedure C_ArcCscHV      (var Z1: TComplex);                       {Z1:=ArcCscH(Z1)}
  Function  C_ArcSecH       (const Z1: TComplex): TComplex;           {Z:=ArcSecH(Z1)}
  Procedure C_ArcSecHV      (var Z1: TComplex);                       {Z1:=ArcSecH(Z1)}
  Function  C_ArcCotH       (const Z1: TComplex): TComplex;           {Z:=ArcCotH(Z1)}
  Procedure C_ArcCotHV      (var Z1: TComplex);                       {Z1:=ArcCotH(Z1)}

  //////////////////////////////////////////////////////////////////////////////
  {中间调用函数} {也可以用包含Math单元的方式,去掉部分函数}
  //(*
  function  CosH    (const x:CmxFloat):CmxFloat;                                    {实数双曲余弦函数: y:=[e^x + e^(-x)]/2}
  function  SinH    (const x:CmxFloat):CmxFloat;                                    {实数双曲正弦函数: y:=[e^x - e^(-x)]/2}
  function  ArcTan2 (const y:CmxFloat;const x:CmxFloat):CmxFloat register;          {ArcTan(Y/X) (值域-PI到PI)}
  function  Floor   (const x:CmxFloat):CmxFloat;                                    {取整,小于x的最大整数}
  function  Ceil    (const x:CmxFloat):CmxFloat;                                    {取整,大于x的最小整数}
  procedure SinCos  (const x: CmxFloat; var Sin , Cos : CmxFloat);                  {同时计算正弦和余弦: Sin:=sin(Theta); Cos:=cos(Theta) }
  procedure SinHCosH(const x: CmxFloat; var SinH, CosH: CmxFloat);                  {同时计算双曲正弦和双曲余弦: SinH:=sinH(Theta); CosH:=cosH(Theta) }
  //*)
  //////////////////////////////////////////////////////////////////////////////

implementation

  {定义常量}
  {$IFDEF Cmx_Extended}
    Const SmallLimit: CmxFloat = 1E-2000;                       {无穷小}
    Const LargeLimit: CmxFloat = 1E+2000;                       {无穷大}
  {$ENDIF}
  {$IFDEF Cmx_Double}
    Const SmallLimit: CmxFloat = 1E-200;                        {无穷小}
    Const LargeLimit: CmxFloat = 1E+200;                        {无穷大}
  {$ENDIF}
  {$IFDEF Cmx_Single}
    Const SmallLimit: CmxFloat = 1E-20;                         {无穷小}
    Const LargeLimit: CmxFloat = 1E+20;                         {无穷大}
  {$ENDIF}
  const PI   : CmxFloat =3.1415926535897932384626433832795 ;    {圆周率PI}
  const SYS_e: CmxFloat =2.7182818284590452353602874713527 ;    {自然数e}
  const Ln2P : CmxFloat =1.4426950408889634073599246810019 ;    {1/Ln(2)}
  const Ln10P: CmxFloat =0.43429448190325182765112891891661 ;   {1/Ln(10)}
  const Half : CmxFloat =0.5;
  const HalfHalf : CmxFloat =0.25;

//==============================================================================
{中间调用函数}

procedure SinCos(const x: CmxFloat; var Sin, Cos: CmxFloat);  register;assembler
asm
        FLD    x
        FSINCOS
        FSTP   CmxFloat [cos]//[edx]
        FSTP   CmxFloat [sin]//[eax]
        //FWAIT
end;

procedure SinHCosH(const x: CmxFloat; var SinH, CosH: CmxFloat); register;assembler
{var
    xTemp   :CmxFloat;
    invxTemp :CmxFloat;
begin
    xTemp:=0.5*exp(Theta);
    invxTemp:=0.25/xTemp;
    SinH := (xTemp - invxTemp);
    CosH := (xTemp + invxTemp);  }
asm
		fld		  x

		FLDL2E           
		FMULp   st(1),st 
		FLD		  ST(0)
		FRNDINT          
		FSUB	  ST(1), ST
		FXCH	  ST(1)
		F2XM1
		FLD1
		FADDp   st(1),st
		FSCALE           
		FSTP    ST(1)

		fld     Half
		fmulp   st(1),st
		fld		  HalfHalf
		fxch	  st(1)
		fdiv	  st(1),st

		fld		  st(0)
		fsub	  st,st(2)
		fstp	  CmxFloat [SinH]//[eax]
		faddp	  st(1),st
		fstp    CmxFloat [CosH]//[edx]

end;


{双曲函数}
function cosh(const x : CmxFloat) : CmxFloat;register;assembler{cosh(x)}   {实数双曲余弦函数: y:= [e^x + e^(-x)]/2}
{var
    xTemp :CmxFloat;
begin
    xTemp:=exp(x);
    result := 0.5*(xTemp + 1/xTemp) ;
    }
asm
		fld	  x

		FLDL2E
		FMULp   st(1),st
		FLD		ST(0)
		FRNDINT
		FSUB	ST(1), ST
		FXCH	ST(1)
		F2XM1
		FLD1
		FADDp   st(1),st
		FSCALE
		FSTP    ST(1)

		fld1
		fdiv	st,st(1)
		faddp	st(1),st
		fld     Half  //0.5
		fmulp   st(1),st

end;

function sinh(const x : CmxFloat) : CmxFloat;register;assembler{sinh(x)}   {实数双曲正弦函数: y:= [e^x - e^(-x)]/2}
{
var
    xTemp :CmxFloat;
begin
    xTemp:=exp(x);
    result := 0.5*(xTemp - 1/xTemp) ;
//}
//{
asm
		fld		x

		FLDL2E           
		FMULp   st(1),st 
		FLD		ST(0)
		FRNDINT          
		FSUB	ST(1), ST  
		FXCH	ST(1)      
		F2XM1
		FLD1
		FADDp   st(1),st
		FSCALE           
		FSTP    ST(1)
			
		fld1 
		fdiv	st,st(1)
		fsubp	st(1),st 
		fld    Half
		fmulp   st(1),st
//}
end;


function ArcTan2(const Y:CmxFloat;const X: CmxFloat): CmxFloat; register;assembler; {ArcTan(Y/X) (值域-PI到PI)}
asm
        FLD     Y
        FLD     X
        FPATAN
end;

function Floor(const X: CmxFloat): CmxFloat; register;assembler {取整,小于x的最大整数}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -