Back to Main Page
Source code

Program Trigs;

{ Gerson Washiski Barbosa - Dec/2007 }
{ Trigonometric and inverse trigonometric functions (17-digit accuracy) }
{ To be compiled in TurboBCD (
Turbo Pascal v3.02) }
{ Running times: Sin, Cos: 160.5 us;  Tan: 321.0 us @ 500 MHz }
{ All angles in DEGREES }

var    x: Real;
     txt: Text;

function Sqrt(x: Real): real;

var sq, t: Real;

begin
  if x<>0 then
    begin
      sq:=x/2;
      repeat
        t:=sq;
        sq:=(sq+x/sq)/2
      until sq=t;
      Sqrt:=sq
    end
    else
      Sqrt:=0
end;

function Intg(x: Real): Real;

var r: Real;

begin
  r:=Int(x);
  if x<0 then r:=r-1;
  Intg:=r
end;

function Mdl(x, y: Real): Real;

begin
  Mdl:=x-y*Intg(x/y)
end;

function Sign(x: Real): Integer;

begin
  if x<>0 then
      Sign:=Trunc((x)/Abs(x))
    else
      Sign:=0
end;

function Sin(x: Real): Real;

const A =  5.81776417331443192E-03;
      B = -3.28183761370851117E-08;
      C =  5.55391614470475312E-14;
      D = -4.47571324262354212E-20;
      E =  2.10398182046943194E-26;
      F = -6.47383342002944734E-33;
      G =  1.40457976326925111E-39;
      H = -2.25584840859272218E-46;

var sn,x2: Real;

begin
  x:=Mdl(x,360);
  if x>90
    then
      if x<270
        then
          x:=180-x
        else
          x:=x-360;
  x2:=x*x;
  sn:=x*(A+x2*(B+x2*(C+x2*(D+x2*(E+x2*(F+x2*(G+H*x2)))))));
  Sin:=sn*(3-4*sn*sn)
end;

function Cos(x: Real): Real;
begin
  Cos:=Sin(90-x)
end;

function Tan(x: Real): Real;
begin
  if Mdl(x,180)<>90
    then
       Tan:=Sin(x)/Cos(x)
    else
       Tan:=Sign(x)*9.99999999999999999E+49
end;

function ArcTan(x: real): Real;

const PI_2 =  1.57079632679489662E+00;    { pi/2 }
      PI_6 =  0.52359877559829887E+00;    { pi/6 }
      SQR3 =  1.73205080756887729E+00;    { sqrt(3) }
      TLS3 =  2.67949192431122706E-01;    { 2 - sqrt(3) }
       R2D =  5.72957795130823209E+01;    { 180/pi }
         A =  1.00000000000000000E+00;
         B = -3.33333333333333320E-01;
         C =  1.99999999999969080E-01;
         D = -1.42857142845613967E-01;
         E =  1.11111109453593870E-01;
         F = -9.09089712757808854E-02;
         G =  7.69182100185790154E-02;
         H = -6.65496746226271243E-02;
         I =  5.71652168403095978E-02;
         J = -3.95856057285009705E-02;

var at, k1, k2, x2: real;
            s1, s2: integer;

begin
  s1:=Sign(x);
  x:=Abs(x);
  if x<1 then
      begin
        s2:=1;
        k1:=0
      end
    else
      begin
        x:=1/x;
        s2:=-1;
        k1:=PI_2
      end;
  if x>TLS3
    then
      begin
        x:=(x*SQR3-1)/(x+SQR3);
        k2:=PI_6
      end
    else
      k2:=0;
  x2:=x*x;
  at:=x*(A+x2*(B+x2*(C+x2*(D+x2*(E+x2*(F+x2*(G+x2*(H+x2*(I+J*x2)))))))));
  ArcTan:=(k1+s2*(k2+at))*s1*R2D
end;

function ArcSin(x: real): real;

begin
  if Abs(x)<=1
    then
      if Abs(x)<1
        then
          ArcSin:=ArcTan(x/(Sqrt(1-x*x)))
        else
          ArcSin:=Sign(x)*90
    else
      begin
        Write(^G);
        WriteLn('ArcSin Error')
      end;
end;

function ArcCos(x: real): real;

begin
  if Abs(x)<=1
    then
      if Abs(x)<1
        then
          ArcCos:=2*ArcTan(Sqrt((1-x)/(1+x)))
        else
          ArcCos:=90*(1-x)
     else
       begin
         Write(^G);
         WriteLn('ArcCos Error')
       end;
end;

begin
  ClrScr;
  Assign(txt,'OUTPUT.TXT');
  Rewrite(txt);
  x:=-180;
  repeat
  if Trunc(x) Mod 60 = 0 then
    begin
      WriteLn(txt);
      WriteLn(txt,'  x',' ':11,'Sin(x)',' ':18,'Cos(x)',' ':18,'Tan(x)');
      WriteLn(txt)
    end;
    WriteLn(txt,x:4:0,'  ',Sin(x):21:18,'   ',Cos(x):21:18,'  ',Tan(x));
    x:=x+1
  until x>179;
  WriteLn(txt);
  x:=-1;
  WriteLn(txt,'   x',' ':9,'ArcSin(x)',' ':16,'ArcCos(x)',' ':16,'ArcTan(x)');
  WriteLn(txt);
  repeat
    WriteLn(txt,x:6:1,'  ',ArcSin(x):22:18,'  ',ArcCos(x):22:18,'  ',ArcTan(x):22:18);
    x:=x+0.1
  until x>1;
  x:=-150;
  repeat
    if x<>0 then WriteLn(txt,x:6:1,'        ------------            ------------      ',ArcTan(x):22:18);
    x:=x+10
  until x>150;
  WriteLn(txt);
  WriteLn(txt,' ArcSin(ArcCos(ArcTan(Tan(Cos(Sin(9)))))) = ',ArcSin(ArcCos(ArcTan(Tan(Cos(Sin(9)))))):20:18);
  Close(txt)
end.



Sample output



x           Sin(x)                  Cos(x)                  Tan(x)

-151  -0.484809620246337029   -0.87461970713939580
1    5.54309051452768917E-01
-150  -0.50000000000000000
1   -0.866025403784438647    5.77350269189625766E-01
-149  -0.515038074910054210   -0.85716730070211228
8    6.00860619027560414E-01

  59   0.85716730070211228
8    0.515038074910054210    1.66427948235051791E+00
  60   0.866025403784438647    0.50000000000000000
1    1.73205080756887729E+00
  61   0.87461970713939580
1    0.484809620246337029    1.80404775527142394E+00

  89   0.99984769515639123
8    0.017452406437283513    5.72899616307594247E+01
  90   1.000000000000000000    0.000000000000000000    9.99999999999999999E+49
  91   0.99984769515639123
8   -0.017452406437283513   -5.72899616307594247E+01

134   0.71933980033865113
8   -0.694658370458997285   -1.03553031379056951E+00
135   0.70710678118654752
3   -0.707106781186547523   -1.00000000000000000E+00
136   0.69465837045899728
5   -0.719339800338651138   -9.65688774807074045E-01

   x         ArcSin(x)                ArcCos(x)                ArcTan(x)

  -1.0  -90.0000000000000000
00 180.000000000000000000 -45.000000000000000300
  -0.9  -64.158067236832871
500 154.158067236832871000 -41.987212495816659900
  -0.8  -53.130102354155979
000 143.130102354155979000 -38.659808254090090300

   0.0    0.00000000000000000
0   90.000000000000000600    0.000000000000000000
   0.1    5.7391704772667863
50   84.260829522733213200    5.710593137499642520
   0.2   11.5369590328154877
00   78.463040967184512000   11.309932474020213100
 
0.4   23.578178478201830900 66.421821521798168400   21.801409486351811500
   0.5  
29.999999999999999800 59.999999999999999600   26.565051177077989100
  0.6   36.869897645844021100   53.130102354155978200   30.963756532073521100

-150.0          ----------            ------------      -89.6180337952709746
00
-140.0          ----------            ------------      -89.590751391965061
500

  10.0          ----------            ------------       84.289406862500357
400
  20.0          ----------            ------------       87.137594773888252
600

  ArcSin(ArcCos(ArcTan(Tan(Cos(Sin(9)))))) =
8.999999999996491040




Back to Programs Page
1