unit2.pas

来自「1、说明: 本书中所有的常用数值算法子过程按书中的章数分别放在以C开头」· PAS 代码 · 共 70 行

PAS
70
字号
unit Unit2;

interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs;

Function GAMMLN(xx:real):real;
procedure GCF(VAR GAMMCF:real; A:real; X:real; var GLN:real);

implementation
Function GAMMLN(xx:real):real;
CONST
  STP=2.50662827465; HALF=0.5; ONE=1.0; FPF=5.5;
var
  x,tmp,ser:double;
  j:integer;
  cof:array[1..6] of double;
BEGIN
  COF[1]:=76.18009173;      COF[2]:=-86.50532033;
  COF[3]:=24.01409822;      COF[4]:=-1.231739516;
  COF[5]:= 0.120858003e-2;  COF[6]:=-0.536382e-5;
  X:=XX-ONE;
  TMP:=X+FPF;
  TMP:=(X+HALF)*Ln(TMP)-TMP;
  SER:=ONE;
  For J:=1 To 6 do
    BEGIN
      X:=X+ONE;
      SER:=SER+COF[J]/X
    END;
  GAMMLN:=TMP+Ln(STP*SER);
end;

procedure GCF(var GAMMCF:real; A:real; X:real; var GLN:real);
label 1;
const
  ITMAX=100;    EPS=0.0000003;
var
  N:integer; GOLD,G,FAC,B1,B0,ANF,ANA,AN,A1,A0:real;
begin
  GLN:=GAMMLN(A);
  GOLD:=0;
  A0:=1;
  A1:=X;
  B0:=0;
  B1:=1;
  FAC:=1;
  For N:=1 To ITMAX do
  begin
    AN:=N;
    ANA:=AN - A;
    A0:=(A1 + A0 * ANA)* FAC;
    B0:=(B1 + B0 * ANA)* FAC;
    ANF:=AN * FAC;
    A1:=X * A0 + ANF * A1;
    B1:=X * B0 + ANF * B1;
    If A1 <> 0 Then
    begin
      FAC:=1 / A1;
      G:=B1 * FAC;
      If Abs((G - GOLD)/ G)< EPS Then GoTo 1;
      GOLD:=G;
    end
  end;
  ShowMessage('A too large, ITMAX too small');
1: GAMMCF:=Exp(-X + A * Ln(X)- GLN)* G;
end;

end.
 

⌨️ 快捷键说明

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