ASMB,R,L,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 "DATAN" DOUBLE PRECISION ARCTANGENT OF X. 
      NAM DATAN,6 24998-1X140 REV.2001 750701 
      ENT DATAN 
      EXT .ZRNT,.ENTP 
      EXT .XADD,.XSUB,.XMPY,.XDIV 
      EXT .DFER,..DCM,.FLUN 
      SPC 2 
* 
*     CALLING SEQUENCE : Y = ARCTAN(X)
*     JSB DATAN 
*     DEF *+3 
*     DEF Y (RESULT)
*     DEF X 
      SPC 2 
TDB   NOP 
      DEC 24
      NOP 
T     REP 3         STORAGE 
      NOP 
P1    REP 3 
      NOP 
V     REP 3           FOR 
      NOP 
Q1    REP 3 
      NOP 
U     REP 3 
      NOP 
Y1    NOP           ADDRESS OF TAN(3*PI/16),T(PI/16)
ALPHA NOP           ADDRESS OF 3*PI/16 OR PI/16 
FLAG  NOP           =-1,+1 IF X NEG. OR POS.
SIGN  NOP           =-1,+1 IF /X/ > 1 OR <1 
Y     NOP 
X     NOP 
DATAN NOP 
      JSB .ZRNT 
      DEF LIBX
      JSB .ENTP     TRANSFER PARAMETERS 
      DEF Y 
      STA TDB+2 
      JSB .DFER     TRANSFER PRAM X TO T
      DEF T 
      DEF X,I 
      LDA T 
      SZA           X = 0 ? 
      JMP CONTU 
      JSB .DFER     SET Y = 0 
      DEF Y,I 
      DEF T 
      JMP LIBX
CONTU CLB,INB       IF X > 0, SIGN = +1 
      SSA 
      CCB             ELSE SIGN = -1
      STB SIGN
      SSB,RSS       IF T < 0, 
      JMP *+3 
      JSB ..DCM      T = -T 
      DEF T 
      LDB T+2 
      JSB .FLUN     IF T >= 1, THEN 
      CMA,INA        -EXPON(T) < 0
      CLB,INB       IF T < 1 , FLAG = +1, 
      SSA            ELSE 
      CCB             FLAG = -1 
      STB FLAG
      SSB,RSS 
      JMP *+5 
      JSB .XDIV      IF T >= 1, 
      DEF T 
      DEF ONE 
      DEF T 
      JSB .XSUB      U = (SQRT(2) - 1) - T
      DEF U 
      DEF SQ2M1 
      DEF T 
      LDB U 
      LDA ADCN2     IF T <= SQRT(2) - 1 - T,
*                                    Y1 = TAN(PI/16) AND
*                                    ALPHA = PI/16
      SSB 
      LDA ADCN1     IF T > SQRT(2) - 1 - T, 
*                                    Y1 = TAN(3*PI/16) AND
*                                    ALPHA = 3*PI/16
      STA Y1
      ADA THREE 
      STA ALPHA 
      JSB .XMPY      U = T * Y1 
      DEF U 
      DEF T 
      DEF Y1,I
      NOP           GIVE THE INTERRUPTS A CHANCE
      JSB .XADD      U = 1 + T * Y1 
      DEF U 
      DEF U 
      DEF ONE 
      NOP           GIVE THE INTERRUPTS A CHANCE
      JSB .XSUB      T = T - Y1 
      DEF T 
      DEF T 
      DEF Y1,I
      JSB .XDIV      T = (T - Y1) / (1 + T * Y1)
      DEF T 
      DEF T 
      DEF U 
      JSB .XMPY      U = T * T = T ** 2 
      DEF U 
      DEF T 
      DEF T 
      NOP           GIVE THE INTERRUPTS A CHANCE
      JSB .XADD      V = U + B3 
      DEF V 
      DEF U 
      DEF B3
      NOP           GIVE THE INTERRUPTS A CHANCE
      JSB .XMPY      P1 = C2 * (U + B3) 
      DEF P1
      DEF C2
      DEF V 
      NOP           GIVE THE INTERRUPTS A CHANCE
      JSB .XADD      Q1 = U + B2
      DEF Q1
      DEF U 
      DEF B2
      JSB .XMPY      Q1 = (U + B2) * (U + B3) 
      DEF Q1
      DEF Q1
      DEF V 
      NOP           GIVE THE INTERRUPTS A CHANCE
      JSB .XADD      Q1 = (U + B2) * (U + B3) + C3
      DEF Q1
      DEF Q1
      DEF C3
      NOP           GIVE THE INTERRUPTS A CHANCE
      JSB .XMPY      V = C1 * Q1
      DEF V 
      DEF C1
      DEF Q1
      NOP           GIVE THE INTERRUPTS A CHANCE
      JSB .XADD      U = U + B1 
      DEF U 
      DEF U 
      DEF B1
      NOP           GIVE THE INTERRUPTS A CHANCE
      JSB .XMPY      U = (U + B1) * Q1
      DEF U 
      DEF U 
      DEF Q1
      NOP           GIVE THE INTERRUPTS A CHANCE
      JSB .XADD      U = (U + B1) * Q1 + P1 
      DEF U 
      DEF U 
      DEF P1
      JSB .XDIV      U = V / U
      DEF U 
      DEF V 
      DEF U 
      JSB .XADD      U = C0 + V / U 
      DEF U 
      DEF U 
      DEF C0
      NOP           GIVE THE INTERRUPTS A CHANCE
      JSB .XMPY      U = U * T
      DEF U 
      DEF U 
      DEF T 
      NOP           GIVE THE INTERRUPTS A CHANCE
      JSB .XADD      Y = U + ALPHA
      DEF Y,I 
      DEF U 
      DEF ALPHA,I 
      ISZ FLAG      IF FLAG = -1, X WAS INVERTED, 
      JMP *+5 
      JSB .XSUB       SO Y = PI/2 - Y 
      DEF Y,I 
      DEF PI2 
      DEF Y,I 
      ISZ SIGN      IF SIGN = -1, X WAS < 0,
      JMP *+3 
      JSB ..DCM      SO Y = -Y
      DEF Y,I 
LIBX  JMP TDB+2,I 
      DEF TDB 
      DEC 0 
      SPC 2 
ONE   OCT 040000,0,2               1. 
THREE DEC 3 
SQ2M1 OCT 065011,163147,172377     SQRT(2) - 1. 
PI2   OCT 062207,166521,010402     PI/2 
CN1   OCT 052606,160252,160000     TAN(3*PI/16) 
      OCT 045545,170774,146400     3*PI/16
CN2   OCT 062727,153601,052775     TAN(PI/16) 
      OCT 062207,166521,010775     PI/16
ADCN1 DEF CN1 
ADCN2 DEF CN2 
C0    OCT 065377,057600,170775     .208979591837
C1    OCT 057417,040551,017004     2.97061224490
C2    OCT 112312,135516,167004    -3.35025248131
C3    OCT 137030,044035,144775    -.128720995297
B1    OCT 050645,157155,170406     5.10299532839
B2    OCT 051261,113644,177004     2.58417875505
B3    OCT 052005,053376,037402     1.31282591656
      END 
* 
                                                                    