extern
function sin ( x : real ): real;
 
const
pi = 3.1415926535897;
two_pi = 6.2831853071796;
 
var
i : integer;
 
procedure compute_sin;
var
result,result2,f,exclam,x2,power : real;
odd1,i : integer;
 
 
begin (* compute_sin *)
x2:=sqr(x);
power:=x*x2;
odd1:=-1;
i:=0;
result:=x;
exclam:=6.0;
f:=3.0;
 
repeat
  result2:=result;
  if odd1 = 1 then
	result := result + (power/exclam)
  else
	result := result - (power/exclam);
  power:=power*x2;
  odd1:=-odd1;
f:=f+2.0;
exclam := f * (f-1.0) * exclam;
  i:=i+1;
  if i > 5 then
    begin
    i:=0;
    if abs(result-result2) < (1e-12*result) then
      result2:=result;
    end;
until result = result2;
 
sin:=result;
end; (* compute_sin *)
 
begin (* sin *)
if (x=0.0) or (x=pi) or (x=two_pi) then sin:=0.0 else
begin
while x < 0.0 do x:=x+two_pi;
while x > two_pi do x:=x-two_pi;
 
if x > 1.0e-08 then compute_sin
else sin := x;
 
end; (* else *)
end; (* sin *).
