{
      TRIGLIB.PAS CONTAINS THE FOLLOWING FUNCTIONS 
      (AS OF 1:13:82 ) :

                        TAN
                        SIGN
                        ANTITAN
                        ARCSINE
                        ARCOSINE
                        RAD2DEGREES
                        DEG2RADIANS
       
THE CONSTANT PI AND THE BOOLEAN FAILURE ARE ASSUMED TO BE GLOBAL
                                                                    }
FUNCTION TAN(X:REAL):REAL;
BEGIN
 TAN:=SIN(X)/COS(X)
END;

FUNCTION SIGN(X:REAL):INTEGER;
BEGIN
 IF X<0 THEN SIGN:=-1 ELSE SIGN:=1
END;{OF FUNCTION SIGN}

FUNCTION ANTITAN(RADIANS : REAL):REAL;

{ WRITTEN BY G.M.ACLAND
  REQUIRES DECLARATION OF 
          CONST PI = ...
          FUNCTION SIGN(X:REAL):INTEGER   
  ACCEPTS ANY REAL NUMBER AS A TAN AND RETURNS THE ARCTAN
  IN RADIANS.ONLY GIVES ANGLES IN 1ST AND 2ND QUADRANTS
     (I.E. FROM 0 TO PI RADIANS = 0 TO 180 DEGREES).
  THUS THE RESULT MAY NOT ALWAYS BE THAT EXPECTED.WHERE
  NECESSARY YOU SHOULD CONSIDER WHETHER THE ANGLE IS
  REALLY (PI + ANTITAN) I.E IN 3RD OR 4TH QUADRANT.
  AVOIDS THE PROBLEMS PASCAL/Z HAS WITH VERY LARGE OR
  NEGATIVE INPUTS TO ITS ARCTAN FUNCTION.                    }

CONST
  MAXTAN = 8388609.0;

BEGIN
  IF ABS(RADIANS)>MAXTAN THEN RADIANS:=MAXTAN*SIGN(RADIANS);
  IF RADIANS<0 THEN ANTITAN := PI-ARCTAN(ABS(RADIANS))
               ELSE ANTITAN := ARCTAN(RADIANS)
END;{FUNCTION ANTITAN}

FUNCTION ARCSINE(SINE:REAL):REAL;

{WRITTEN BY G.M.ACLAND
 REQUIRES :
           CONST PI
           VARIABLE FAILURE (A GLOBAL BOOLEAN)
           FUNCTIONS ANTITAN AND SIGN
 ACCEPTS ANY REAL NUMBER AS INPUT 
 CHECKS FOR OUT OF BOUNDS ( FAILURE WILL BE TRUE IF INPUT > 1)
 RETURNS AN ANGLE BETWEEN -(PI/2) AND +(PI/2) RADIANS 
          (I.E. -90 TO +90 DEGREES)
 THUS THE RESULT MAY NOT ALWAYS BE THAT EXPECTED : IN THAT
 CASE CONSIDER WHETHER ANGLE IS REALLY ( PI-ARCSINE )          }

BEGIN
 IF SINE > 1.0 THEN FAILURE := TRUE
 ELSE
  IF SINE = 0.0 THEN ARCSINE := 0.0
  ELSE
    IF ABS(SINE)=1.0 THEN ARCSINE := (PI/2.0)*SIGN(SINE)
    ELSE ARCSINE := (ANTITAN(ABS(SINE)/SQRT(1.0-SINE*SINE)))*SIGN(SINE)
END;{OF FUNCTION ARCSINE}


FUNCTION ARCOSINE(COSINE : REAL):REAL;

{WRITTEN BY G.M.ACLAND
 ACCEPTS ANY REAL INPUT
 CHECKS FOR OUT OF BOUNDS
 RETURNS ANGLE BETWEEN 0 AND PI RADIANS (0 TO 180 DEGREES)
 THUS "TRUE" ANGLE MAY BE ( PI + ARCOSINE )

 REQUIRES 
        PI       ( CONST = 3.1415927 )
        ANTITAN  ( FUNCTION : GMA    )
        FAILURE  ( GLOBAL BOOLEAN    )                        }
        
BEGIN
 IF COSINE > 1.0 THEN FAILURE := TRUE
 ELSE
  IF COSINE = 0.0 THEN ARCOSINE := (PI/2.0)
  ELSE 
   IF COSINE = 1.0 THEN ARCOSINE := 0.0
   ELSE 
    IF COSINE = -1.0 THEN ARCOSINE := PI
      ELSE ARCOSINE := ANTITAN((SQRT(1.0-COSINE*COSINE))/COSINE)
 END;{OF FUNCTION ARCOSINE}

FUNCTION RAD2DEGREES(ANGLE:REAL):REAL;
 BEGIN
   RAD2DEGREES:=(ANGLE*360.0)/(2.0*PI)
 END;{OF FUNCTION RAD2DEGREES}

FUNCTION DEG2RADIANS(ANGLE:REAL):REAL;
 BEGIN
   DEG2RADIANS:=(ANGLE*2.0*PI)/360.0
 END;{OF FUNCTION DEG2RADIANS}

