home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / simtel / sigm / vols000 / vol082 / arctan.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1984-04-29  |  1.2 KB  |  80 lines

  1. extern
  2. function arctan ( x : real ): real;
  3.  
  4. const
  5. half_pi        = 1.5707963267948;
  6. sixth_pi    = 0.52359877559828;
  7. twelfth_pi    = 0.26179938779914;
  8. sqrt3        = 1.7320508075689;
  9.  
  10. var
  11. flag2,flag3,i : integer;
  12. result : real;
  13. sign : char;
  14.  
  15. procedure compute;
  16. var
  17. flip,power,x2,odd1,result2 : real;
  18. i,j : integer;
  19.  
  20. begin (* compute *)
  21. flip:=1.0;
  22. power:=x;
  23. x2:=sqr(power);
  24. odd1:=1.0;
  25. j:=0;
  26. i:=0;
  27. result:=0.0;
  28.  
  29. repeat
  30.   result2:=result;
  31.   result:=result + flip * ( power/odd1 );
  32.   odd1:=odd1+2.0;
  33.   flip:=-flip;
  34.   power:=power * x2;
  35.   j:=j+1;
  36.   i:=i+1;
  37.   if i > 5 then
  38.     begin
  39.     i:=0;
  40.     if abs(result-result2) < (1e-12*result) then
  41.     result2:=result;
  42.     end;
  43. until result = result2;
  44. end; (* compute *)
  45.  
  46. begin (* arctan *)
  47. if x = 0.0 then arctan:=0.0
  48. else
  49. begin
  50. if x < 0.0 then begin x:=-x; sign:='-' end
  51.    else sign:='+';
  52.  
  53. if x > 1.0 then
  54.   begin
  55.   x:=1.0/x;
  56.   flag2:=1;
  57.   end
  58. else flag2:=0;
  59.  
  60. if x > twelfth_pi then
  61.   begin
  62.   x:=( sqrt3 * x - 1.0 )/( x + sqrt3 );
  63.   flag3:=1;
  64.   end
  65. else flag3:=0;
  66.  
  67. compute;
  68.  
  69. if flag3 = 1 then
  70.   result:=result + sixth_pi;
  71.  
  72. if flag2 = 1 then
  73.   result:=half_pi - result;
  74.  
  75. if sign = '-' then arctan:=-result else arctan:=result;
  76.  
  77. end; (* else *)
  78.  
  79. end;. (* arctan *)
  80.