ASMB,L,R,C
* 
*  **************************************************************** 
*  * (C) COPYRIGHT HEWLETT-PACKARD COMPANY 1979.  ALL RIGHTS      * 
*  * RESERVED.  NO PART OF THIS PROGRAM MAY BE PHOTOCOPIED,       * 
*  * REPRODUCED OR TRANSLATED TO ANOTHER PROGRAM LANGUAGE WITHOUT * 
*  * THE PRIOR WRITTEN CONSENT OF HEWLETT-PACKARD COMPANY.        * 
*  **************************************************************** 
* 
*   NAME: PART OF MATH LIBRARY
*   SOURCE:  24998-18XXX  SEE NAM FOR LAST THREE DIGITS 
*   RELOC: PART OF 24998-12001
*   PGMR: BG & JTS
* 
      HED ".TAN" - TRIPLE PRECISION TRIGONOMETRIC TANGENT.
      NAM .TAN,7 24998-1X129 REV.2001 790417
* 
      ENT .TAN
      EXT .ENTR,/CMRT,DPOLY,.TDIV 
* 
*     .TAN TAKES THE TRIPLE-PRECISION TANGENT OF A
*     TRIPLE-PRECISION NUMBER.
* 
*     CALLING SEQUENCE: 
* 
*                   JSB .TAN
*                   DEF *+3 
*                   DEF <RESULT>
*                   DEF <ARG> 
*                   <ERROR RETURN>    (A,B) = ASCII "09OR"
*                   <NORMAL RETURN> 
* 
*     THE ERROR RETURN IS TAKEN IF THE ARGUMENT IS OUTSIDE
*     THE RANGE  [-2**23,+2**23) .
* 
*     METHOD:  THE ROUTINE ".CMRT" IS USED TO SUBTRACT N*PI/2 FROM
*     THE ARGUMENT AND MULTIPLY BY 4/PI, WHERE N IS CHOSEN S.T. 
*     THE RESULT IS IN [-1,+1] .  THE LOWEST BIT OF N (EVEN/ODD)
*     IS ALSO RETURNED. 
*     THE TANGENT IS THEN EVALUATED ON THIS REDUCED INTERVAL, AND 
*     THE RESULT IS INVERTED AND NEGATED IF N WAS ODD.  SEE "TAN".
* 
*     THE APPROXIMATION USED FOR TANGENT ON [-1,+1] IS: 
* 
*                                     C1+YSQ*(C2+YSQ*(C3+YSQ*C4)) 
*              TANGENT(Y*4/PI) = Y * -----------------------------
*                                     C5+YSQ*(C6+YSQ*(C7+YSQ))
* 
*     WHERE:
*                   C1 = -.160528895723771175D+5
*                   C2 = +.127029221227298238D+4
*                   C3 = -.171390807007805963D+2
*                   C4 = +.281970876313544687D-1
*                   C5 = -.204391738108172811D+5
*                   C6 = +.582002294049071829D+4
*                   C7 = -.181557373390721805D+3
* 
*     NOTE ON SPEED: IF DPOLY WERE NOT USED, IT WOULD BE POSSIBLE TO
*     AVOID THE INVERSION STEP BY REVERSING THE ORDER OF THE ABOVE
*     DIVIDE.  THIS WOULD REQUIRE TWO CALLS TO DPOLY (ONE FOR THE 
*     NUMERATOR AND ONE FOR THE DENOMINATOR) AND A DIVIDE, WHICH WOULD
*     TAKE AS MUCH ADDITIONAL TIME AS THE EXTRA DIVIDE NOW TAKES. 
      SKP 
*                   RANGE REDUCE. 
* 
RESLT DEF *-* 
ARG   DEF *-* 
.TAN  NOP 
      JSB .ENTR     COPY ADDRESSES
      DEF RESLT 
      CLA           "TAN" FLAG TO /CMRT 
      JSB /CMRT     REDUCE
      DEF X 
      DEF C 
      DEF ARG,I 
      JMP ERROR     TOO BIG.
      STB N         SAVE EVEN/ODD FLAG
      ISZ .TAN      SET NORMAL RETURN 
* 
*                   EVALUATE APPROXIMATION
* 
      JSB DPOLY 
      OCT 100000    FLAGS 
      DEF RESLT,I 
      DEF X 
      DEF C4        CONSTANTS 
      DEF THREE     ORDER OF NUMERATOR
      DEF THREE     ORDER OF DENOMINATOR
      LDA N         ODD # OF PI/2 ? 
      RAR,SLA 
      JMP *+2 
      JMP .TAN,I    NO, EXIT. 
      JSB .TDIV     YES, TAKE -1.0 / RESULT 
      DEF RESLT,I 
      DEF MONE
      DEF RESLT,I 
      JMP .TAN,I    EXIT
* 
*                   ERROR PROCESSING
* 
ERROR LDA =A09      (A,B) = ASCII "09OR"
      LDB =AOR
      JMP .TAN,I
      SKP 
*                   LOCALS & CONSTANTS
* 
X     BSS           4 REDUCED ARG 
N     BSS 1         EVEN/ODD FLAG 
THREE DEC 3         INTEGER 3 
MONE  OCT 100000,0,0,0  4-WD -1.0 
C     OCT 050574,140667,023442,005402  4/PI FIRST 55 BITS 
CL    OCT 071162,020251,047741,035713  4/PI AFTER 1ST 28 BITS 
C4    OCT 071576,145023,100575,032767 
C3    OCT 135561,112324,025222,000012 
C2    OCT 047544,126346,143277,030026 
C1    OCT 101226,034211,174051,133034 
C7    OCT 122470,123775,016630,034020 
C6    OCT 055360,013575,133105,107432 
C5    OCT 130050,151601,021140,013036 
      END 
                                                                                                                                                                                                                              