RosettaCodeData/Task/Gamma-function/Modula-2/gamma-function.mod2
2026-04-30 12:34:36 -04:00

55 lines
1.1 KiB
Text

MODULE GammaFun;
(* Gamma function *)
(* Lanczos approximation *)
FROM LongMath IMPORT
exp, ln, pi, sin, sqrt;
FROM SLongIO IMPORT
WriteFixed;
FROM STextIO IMPORT
WriteLn, WriteString;
VAR
X: LONGREAL;
PROCEDURE Gamma(Z: LONGREAL): LONGREAL;
TYPE
LZArr = ARRAY [0 .. 6] OF LONGREAL;
VAR
LZ: LZArr;
PROCEDURE LnGamma(Z: LONGREAL): LONGREAL;
(* Uses LZ *)
VAR
B, A: LONGREAL;
I: CARDINAL;
BEGIN
IF Z < 0.5 THEN
RETURN ln(pi / sin(pi * Z)) - LnGamma(1.0 - Z)
ELSE
Z:= Z - 1.0;
B:= Z + 5.5;
A:= LZ[0];
FOR I:= 1 TO 6 DO
A:= A + LZ[I] / (Z + LFLOAT(I))
END;
RETURN (ln(sqrt(2. * pi)) + ln(A) - B) + ln(B) * (Z + 0.5)
END;
END LnGamma;
BEGIN
LZ:= LZArr{1.00000000019001, 76.1800917294715, -86.5053203294168,
24.0140982408309, -1.23173957245015, 1.2086509738662E-3,
-0.000005395239385};
RETURN exp(LnGamma(Z))
END Gamma;
BEGIN
X:= 0.1;
WHILE X < 2.05 DO
WriteFixed(X, 1, 4);
WriteString(" ");
WriteFixed(Gamma(X), 12, 15);
WriteLn;
X:= X + 0.1
END;
END GammaFun.