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 *).
