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

📄 mmmath.pas

📁 一套及时通讯的原码
💻 PAS
字号:
{========================================================================}
{=                (c) 1995-98 SwiftSoft Ronald Dittrich                 =}
{========================================================================}
{=                          All Rights Reserved                         =}
{========================================================================}
{=  D 01099 Dresden             = Tel.: +0351-8012255                   =}
{=  Loewenstr.7a                = info@swiftsoft.de                     =}
{========================================================================}
{=  Actual versions on http://www.swiftsoft.de/mmtools.html             =}
{========================================================================}
{=  This code is for reference purposes only and may not be copied or   =}
{=  distributed in any format electronic or otherwise except one copy   =}
{=  for backup purposes.                                                =}
{=                                                                      =}
{=  No Delphi Component Kit or Component individually or in a collection=}
{=  subclassed or otherwise from the code in this unit, or associated   =}
{=  .pas, .dfm, .dcu, .asm or .obj files may be sold or distributed     =}
{=  without express permission from SwiftSoft.                          =}
{=                                                                      =}
{=  For more licence informations please refer to the associated        =}
{=  HelpFile.                                                           =}
{========================================================================}
{=  $Date: 20.01.1998 - 18:00:00 $                                      =}
{========================================================================}
unit MMMath;

{$I COMPILER.INC}

interface

const
  {$IFDEF BCB} {$EXTERNALSYM M_PI} {$ENDIF}
   M_PI  = 3.14159265358979323846;
  {$IFDEF BCB} {$EXTERNALSYM M2_PI} {$ENDIF}
   M2_PI = 2 * M_PI;

function MinR(a, b: extended): extended;
function MaxR(a, b: extended): extended;
function MinMaxR(x, min, max: extended): extended;
function LimitR(x, min, max: extended): extended;
function ModR(x,y: extended): extended;

function ArcCos(x: extended): extended;  { IN: |X| <= 1  OUT: [0..PI] radians }
function ArcSin(x: extended): extended;  { IN: |X| <= 1  OUT: [-PI/2..PI/2] radians }
function ArcTan2(y, x: extended): extended;
function Tan(x: extended): extended;
function Cotan(x: extended): extended;   { 1 / tan(X), X <> 0 }

function Ceil(x: extended): longint;
function Floor(x: extended): Longint;
function Log(x: extended): extended;
function Log2(x: extended): extended;
function Log10(x: extended): extended;
function Pow(x,n: extended): extended;

implementation

{-------------------------------------------------------------------------}
{ MinR: Returns the smallest signed value }
function MinR(a, b: extended): extended;
begin
   if a < b then Result := a
   else Result := b;
end;

{-------------------------------------------------------------------------}
{ MaxR: Returns the largest signed value }
function MaxR(a, b: extended): extended;
begin
   if a > b then Result := a
   else Result := b;  
end;

{-------------------------------------------------------------------------}
{ MinMaxR: Returns a value between Min and Max }
function MinMaxR(x, min, max: extended): extended;
begin
   if x < min then Result := min
   else if x > max then Result := max
   else Result := x;
end;

{-------------------------------------------------------------------------}
function LimitR(x, min, max: extended): extended;
begin
   if (max >= min) then
   begin
      if (x < min) then x := min
      else if (x > max) then x := max;
   end
   else
   begin
      if (x < max) then x := max
      else if (x > min) then x := min;
   end;
   Result := x;
end;

{-------------------------------------------------------------------------}
{ ModR: Real modulo                                                       }
function ModR(x,y: extended): extended;
begin
   Result := x - int(x/y)*y;
end;

{-------------------------------------------------------------------------}
{ Ceil: Smallest integer >= X, |X| < MaxInt }
function Ceil(x: extended): longint;
begin
   Result := Trunc(x);
   if Frac(x) > 0 then inc(Result);
end;

{-------------------------------------------------------------------------}
{ Floor: Largest integer <= X,  |X| < MaxInt }
function Floor(x: extended): longint;
begin
   Result := Trunc(x);
   if Frac(x) < 0 then dec(Result);
end;

{-------------------------------------------------------------------------}
function ArcCos(x: extended): extended;
begin
   Result := ArcTan2(Sqrt(1 - x*x), x);
end;

{-------------------------------------------------------------------------}
function ArcSin(x: extended): extended;
begin
   Result := ArcTan2(x, Sqrt(1 - x*x))
end;

{-------------------------------------------------------------------------}
function ArcTan2(y, x: extended): extended; assembler;
asm
      fld     y
      fld     x
      fpatan
      fwait
end;

{-------------------------------------------------------------------------}
function Tan(x: extended): extended; assembler;
{  Tan := Sin(X) / Cos(X) }
asm
      fld     x
      fptan
      fstp    st(0)      { FPTAN pushes 1.0 after result }
      fwait
end;

{-------------------------------------------------------------------------}
function CoTan(x: extended): extended; assembler;
{ CoTan := Cos(X) / Sin(X) = 1 / Tan(X) }
asm
      fld     x
      fptan
      fdivrp
      fwait
end;

{-------------------------------------------------------------------------}
function Log(x: extended): extended; assembler;
asm
      fld1
      fld     x
      fyl2x
      fldl2e
      fdivp   st(1),st
      fwait
end;

{-------------------------------------------------------------------------}
function Log2(X: Extended): Extended; assembler;
asm
      fld1
      fld     x
      fyl2x
      fwait
end;

{-------------------------------------------------------------------------}
function Log10(x: extended): extended; assembler;
asm
      fldlg2  { Log base ten of 2 }
      fld     x
      fyl2x
      fwait
end;

{-------------------------------------------------------------------------}
function Pow(x,n: extended): extended; assembler;
asm
      fld     n
      fld     x
      fyl2x
      fld     st(0)
      frndint
      fld     st(0)
      fsubp   st(2), st
      fxch    st(1)
      f2xm1
      fld1
      faddp   st(1), st
      fscale
      fstp    st(1)
end;

end.

⌨️ 快捷键说明

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