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 ".LOG" - TRIPLE PRECISION NATURAL LOGARITHM.
      NAM .LOG,7 24998-1X158 REV.2001 790417
* 
      ENT .LOG
      EXT .ENTR,.CFER,.FLUN,.TADD,.TMPY,DPOLY,/ATLG,FLOAT 
* 
*     .LOG TAKES THE TRIPLE-PRECISION NATURAL LOGARITMH OF A
*     TRIPLE-PRECISION NUMBER.
* 
*     CALLING SEQUENCE: 
* 
*                   JSB .LOG
*                   DEF *+3 
*                   DEF <RESULT>
*                   DEF <ARG> 
*                   <ERROR RETURN>   (A,B) = ASCII "02UN" 
*                   <NORMAL RETURN> 
* 
*     THE ERROR RETURN IS TAKEN IF THE ARGUMENT IS NEGATIVE OR ZERO.
* 
*     METHOD:  THE IDENTITY:
* 
*                   LN(X) = N*LN(2) + LN(X/LN(2)) 
* 
*     IS USED TO REDUCE THE RANGE TO [.707,1.414] .  ON THIS RANGE, 
*     THE FOLLOWING APPROXIMATION IS USED:
* 
*                                C1+ZSQ*(C2+ZSQ*C3) 
*                   LN(Y) = Z * --------------------------
*                                C4+ZSQ*(C5+ZSQ*(C6+ZSQ)) 
* 
*     WHERE:
*                    Z =   (1-Y) / (1+Y)
*                   C1 = +.903435497728419518D2 
*                   C2 = -.935961251529860988D2 
*                   C3 = +.183395455436327320D2 
*                   C4 = -.451717748864209816D2 
*                   C5 = +.618553208719806812D2 
*                   C6 = -.207538580906546412D2 
      SPC 2 
*                   COPY ARGUMENT.
* 
RESLT DEF *-* 
ARG   DEF *-* 
.LOG  NOP 
      JSB .ENTR     COPY ADDRESSES
      DEF RESLT 
      JSB .CFER     COPY ARG
      DEF Y 
      DEF ARG,I 
      SKP 
*                   SEE IF ARG <= 0, SCALE: Y = X * 2**N .
* 
      LDA Y         X <= 0 ?
      SSA,RSS 
      CLE,SZA,RSS   (E=0) 
      JMP ERROR     YES, ERROR. 
      ISZ .LOG      NO, SET NORMAL RETURN.
      ADA =B-55202  MANTISSA - .707 :  E=1 IFF > .707 
      LDB Y+3       SCALE TO [.5,1) 
      JSB .FLUN 
      SEZ,RSS       IF IN [.5,.707) : 
      ADB TWO       DOUBLE IT 
      SEZ,RSS 
      ADA =D-1      AND DECR N .
      STB Y+3 
      JSB FLOAT     FLOAT N 
      STA TEMP      STORE AS 4-WORD 
      CLA 
      STA TEMP+1
      STA TEMP+2
      STB TEMP+3
      JSB .TMPY     TAKE N*LN(2) NOW
      DEF TEMP
      DEF TEMP
      DEF LN2 
* 
*                   TAKE LOG OF SCALED VALUE. 
* 
      JSB /ATLG     Z = (1-Y)/(1+Y) 
      DEF Y 
      JSB DPOLY 
      OCT 100000
      DEF Y 
      DEF Y 
      DEF C3        CONSTANTS 
      DEF TWO       NUMERATOR: SECOND ORDER 
      DEF THREE     DENOMINATOR: THIRD ORDER
* 
*                   UNDO RANGE REDUCTION:  ADD N*LN(2) .
* 
      JSB .TADD     RESULT = N*LN(2) + LN(Y)
      DEF RESLT,I 
      DEF TEMP
      DEF Y 
      JMP .LOG,I    EXIT
* 
*                   ERROR HANDLING. 
* 
ERROR LDA =A02      (A,B) = ASCII "02UN"
      LDB =AUN
      JMP .LOG,I    ERROR EXIT
      SKP 
*                   LOCALS & CONSTANTS. 
* 
Y     BSS 4         ARG, REDUCED ARG. 
TEMP  BSS 4         FOR FLOAT(N) AND N*LN(2)
TWO   DEC 2         INTEGER 2 
THREE DEC 3         INTEGER 3 
      SUP 
C3    OCT 044533,130723,132636,054412 
C2    OCT 121147,062127,105632,005016 
C1    OCT 055127,171340,137347,104016 
C6    OCT 126374,006237,165500,152412 
C5    OCT 075665,166236,004574,104014 
C4    OCT 122650,006437,040430,072414 
LN2   OCT 054271,005773,164347,136400 
      UNS 
      END 
                                                                                                