home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
norge.freeshell.org (192.94.73.8)
/
192.94.73.8.tar
/
192.94.73.8
/
pub
/
computers
/
cpm
/
alphatronic
/
JRTPAS40.ZIP
/
LN.PAS
< prev
next >
Wrap
Pascal/Delphi Source File
|
1999-04-03
|
2KB
|
67 lines
EXTERN
{=================================================================}
FUNCTION ln (x : real) : real;
CONST
index = 16;
ln4 = 0.13862943611196e+01;
r3 = 0.33333333333333e+00;
r5 = 0.20000000000000e+00;
r7 = 0.14285714285714e+00;
r9 = 0.11111111111111e+00;
r11 = 0.90909090909091e-01;
r13 = 0.76923076923077e-01;
r15 = 0.66666666666667e-01;
r17 = 0.58823529411765e-01;
r19 = 0.52631578947368e-01;
r21 = 0.47619047619048e-01;
r23 = 0.43478260869565e-01;
r25 = 0.40000000000000e-01;
r27 = 0.37037037037037e-01;
r29 = 0.34482758620690e-01;
r31 = 0.32258064516129e-01;
VAR
div_count, i : integer;
result, term, term2 : real;
p : ARRAY [1..index] OF real;
BEGIN (* ln - natural logarithm *)
IF x <= 0.0 THEN
ln := - 0.99999999999999e+63
ELSE
BEGIN
(* x must be in range 0.7 to 2.85 *)
div_count := 0;
WHILE x < 0.7 DO
BEGIN
x := x * 4;
div_count := div_count - 1;
END;
WHILE x > 2.85 DO
BEGIN
x := x / 4;
div_count := div_count + 1;
END;
term := (x - 1.0) / (x + 1.0);
term2 := sqr(term);
FOR i := 1 TO index DO
BEGIN
p[i] := term;
IF (abs(term) <= 0.9e-51) THEN
term := 0.0
ELSE
term := term * term2;
END;
result := 2.0 * (p[1] + (p[2] * r3) + (p[3] * r5) + (p[4] *
r7) + (p[5] * r9) + (p[6] * r11) + (p[7] * r13) + (
p[8] * r15) + (p[9] * r17) + (p[10] * r19) + (p[11] *
r21) + (p[12] * r23) + (p[13] * r25) + (p[14] * r27) + (
p[15] * r29) + (p[16] * r31));
ln := result + div_count * ln4;
END; (* else *)
END; (* ln *) .