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" SINGLE PRECISION TRIGONOMETRIC TANGENT. 
      NAM TAN,6 24998-1X151 REV.2001 780424 
* 
      ENT TAN 
      EXT .ZPRV,.CMRS 
* 
A     EQU 0 
B     EQU 1 
* 
*     TAN TAKES THE SINGLE-PRECISION TANGENT OF A SINGLE-PRECISION
*     ARGUMENT. 
* 
*     CALLING SEQUENCE: 
* 
*                   DLD <ARG> 
*                   JSB TAN 
*                   <ERROR RETURN>    (A,B) = ASCII "09OR"
*                   <NORMAL RETURN>   (A,B) = RESULT
* 
*     THE ERROR RETURN IS TAKEN FOR ARGUMENTS OUTSIDE THE RANGE 
*     [-32768*PI/4,+32768*PI/4).
* 
*     METHOD:  THE ARGUMENT IS REDUCED TO THE RANGE [-PI/4,+PI/4] 
*     USING THE IDENTITIES: 
*                   TAN(X) = TAN(X+K*PI)
*                   TAN(X) = -1.0 / TAN(X+PI/2) 
*     EFFECTIVELY, THE CLOSEST MULTIPLE OF PI/2 TO X IS SUBTRACTED
*     FROM IT.  ACTUALLY, THE ARGUMENT IS MULTIPLIED BY 4/PI (IN DOUBLE 
*     PRECISION) AND THE NEAREST EVEN INTEGER IS SUBTRACTED, SCALING
*     THE RESULT BY 4/PI TO THE RANGE [-1,+1].  THE TANGENT IS EVALUATED
*     ON THIS RANGE, AND THE RESULT IS INVERTED AND NEGATED IF AN ODD # 
*     OF PI/2 WERE SUBTRACTED (BIT 1 OF THE ABOVE EVEN INTEGER IS SET). 
* 
*     IN THE RANGE [-PI/4,+PI/4] THE FOLLOWING APPROXIMATION IS USED: 
* 
*                                                      C3 
*                   TAN(X) = X * (C1 + C2 * (XSQ + ----------- ) ) )
*                                                   C4 + X**2 
*     WHERE:
*                   C1 = .14692695
*                   C2 = .0019974806
*                   C3 = -1279.5424 
*                   C3 = -4.0030956 
      SKP 
*                   RANGE REDUCE, SET FLIP FLAG.
* 
TAN   NOP 
      JSB .ZPRV     FOR SHARING.
      DEF LIBX
      JSB .CMRS     X = MOD(ARG*4/PI+SIGN(1,ARG),2)-1 
      DEF .4PI      I.E., SUBTRACT THE MULTIPLE OF PI/2 WHICH 
      DEF N         MINIMIZES THE RESULT, THEN MULT BY 4/PI.
      JMP ERROR     IF ARGUMENT TOO BIG 
      ISZ TAN       ELSE GOOD RETURN
      STA X         X IS REDUCED VALUE
      STB X+1 
      LDA N         SET N = -1 IFF ODD MULTIPLE OF PI/2 
      IOR =B177775  I.E., BIT 1 SET.
      STA N 
      LDA X 
* 
*                   COMPUTE RATIONAL FORM APPROXIMATION 
* 
      FMP X         X**2
      STA XSQ 
      STB XSQ+1 
      FAD C4        C4+XSQ
      STA TEMP
      STB TEMP+1
      LDA C3
      LDB C3+1
      FDV TEMP      C3/(C4+XSQ) 
      FAD XSQ       XSQ+C3/...
      FMP C2        C2*(XSQ+...)
      FAD C1        C1+C2*(...) 
      FMP X         RESULT = X*(C1+C2*(XSQ+C3/(C4+XSQ)))
      ISZ N         INVERT ?
      JMP LIBX      NO, DONE. 
      STA TEMP      YES, TAKE NEGATIVE RECIPROCAL.
      STB TEMP+1
      LDA =B100000  FORM -1.0 
      CLB 
      FDV TEMP      RESULT
LIBX  JMP TAN,I     EXIT
      DEF TAN 
      SKP 
*                   ERROR PROCESSING
* 
ERROR LDA =A09
      LDB =AOR
      JMP LIBX
* 
*                   LOCAL STORAGE AND CONSTANTS 
* 
X     BSS 2         REDUCED ARGUMENT
XSQ   BSS 2         X**2
TEMP  BSS 2         TEMP
N     BSS 1         INVERT FLAG: -1 IFF MUST INVERT RESULT
C1    DEC .14692695 
C2    DEC .0019974806 
C3    DEC -1279.5424
C4    DEC -4.0030956
.4PI  OCT 050574,140667,023402  4/PI
      END 
$ 
                                                                                                                                                                                    