procedure sarctan(var x,y: scalar);
var
  i,ifac,icheck: integer;
  stenth,x1,x2,s0,s1,s2: scalar;

begin { sarctan }
  stenth:=sone;
  isdiv(10,stenth);
  x1:=x;
  sprod(x1,x1,x2);
  sabs(x1,s0);

  ifac:=1;
  icheck:=topint;
  while sge(s0,stenth) do begin
    ifac:=2*ifac;
    icheck:=icheck div 2;
    ssum(x2,sone,s1);
    ssqrt(s1,s2);
    ssum(s2,sone,s1);
    squot(x1,s1,s2);
    x1:=s2;
    sprod(x1,x1,x2);
    sabs(x1,s0);
  end;
  if icheck=0 then writeln('sarctan: error - argument out of range');

  s0:=sone;
  s0.l.si:=0;
  isdiv(4*hdim+1,s0);
  icheck:=(topint-1) div 4;
  if icheck<hdim then writeln('sarctan: error - hdim too large');

  for i:=2*hdim-1 downto 0 do begin
    s1:=sone;
    isdiv(2*i+1,s1);
    sprod(x2,s0,s2);
    sdiff(s1,s2,s0);
  end;

  sprod(x1,s0,y);
  ismult(ifac,y);  
end { sarctan };

