*DECK     LN
          IDENT  P.LN 
          B1=1
          ENTRY  P.LN 
 LN       SPACE  4,10 
 LN       TITLE  LN - NATURAL LOGARITHM OF ARGUMENT.
          COMMENT PASCAL 6000 NATURAL LOGARITHM ROUTINE.
          COMMENT COPYRIGHT (C) UNIVERSITY OF MINNESOTA - 1978. 
 LN       SPACE  4,10 
***       LN - NATURAL LOGARITHM OF ARGUMENT. 
*         L. A. LIDDIARD.    CIRCA 1970.
*         D. M. LALIBERTE.   76/08/25.
* BRING DOCUMENTATION UP TO CODING STANDARDS. 
 LN       SPACE  4,10 
***       LN - NATURAL LOGARITHM OF ARGUMENT. 
* 
*         ENTRY  (B1) = 1.
*                (X1) = ARGUMENT. 
* 
*         EXIT   (X6) = NATURAL LOGARITHM OF ARGUMENT.
*                EXITS TO P.SABRT IF ARGUMENT OUT OF RANGE. 
* 
*         USES   A - 2, 3, 5. 
*                B - 2, 3, 7. 
*                X - ALL. 
* 
*         CALLS  P.SABRT. 
* 
*         MACROS NONE.
* 
*         ALGORITHM AND CONSTANTS COPYRIGHT (C) 1970 BY PROFESSOR 
*         KRZYSZTOF FRANKOWSKI, UNIVERSITY OF MINNESOTA.
* 
*         RELATIVE ACCURACY (I.E. ERROR/RESULT) 
*         AVERAGE = 1.8E-15 IN THE RANGE   .135  BY .00072   TO  7.38 
*         WORST   =   8E-15 IN THE RANGE   .135  BY .00072   TO  7.38 
* 
*         OPTIMIZED FOR CDC 6600 (OR 6700), OR CDC CYBER 74 COMPUTERS.
  
  
 P.LN     PS                 ENTRY/EXIT 
          MX4    16          MASK FOR Z0 IF ARGUMENT >= 1.0 
          SB3    -47         B3=EXPONENT OF 1.0 
          UX7,B7 X1          B2=ARGUMENT EXPONENT 
          BX2    X7          SAVE MANTISSA
          AX7    44          I+8
          GE     B7,B3,LOG1  IF ARGUMENT >= 1.0 
          SX6    X7+B1       FORM Z0 .5625(.0625)1.0
          LX6    44 
          SB2    X7+LOGD-15  LOAD CONM(I) (IE LOGE(Z0)
          IX5    X2+X6       FORM Z+Z0
          AX5    1
          IX2    X2-X6       FORM Z-Z0
          PX0    X5,B3       PACK EXPONENT 1.0
          SB3    B3-B1
          PX2    X2,B3       PACK EXPONENT 0.5
          SA5    LOGC        LOAD LOGE(2.0) LOWER 
          NX2    X2 
          RX0    X2/X0       T=(Z-Z0)/(Z+Z0)
          AX1    48 
          SX7    B7-B3       FORM N 
          SB3    X1+
          LT     B0,B3,LOG2  IF ARGUMENT > 0.0
          EQ     LOG4 
  
 LOG1     PX5    X1,B3       FORM 2Z
          BX6    X4*X5       FORM Z0  1.(.125)1.875 
          FX0    X5+X6       2Z+Z0
          BX3    X1          SAVE ARGUMENT
          AX1    48 
          BX5    -X4*X5      FORM 2Z-Z0 
          SB2    X7+LOGD-8   LOAD LOGD(I) (IE LOGE(Z0)) 
          PX6    X5,B3       PACK EXPONENT OF 1.0 
          SA5    LOGC        LOAD LOGE(2.0) LOWER 
          NX2    X6 
          RX0    X2/X0       T=(2Z-Z0)/(2Z+Z0)
          LX3    2           SEE IF INFINITE OR INDEFINITE ARGUMENT 
          SX7    B7-B3       FORM N-1 
          AX3    50 
          NZ     X3,LOG2
          NZ     B7,LOG3     IF INFINITE OR INDEFINITE ARGUMENT 
  
 LOG2     PX7    X7          FLOAT N OR N-1 CALL IT M 
          SA2    A5+B1       LOAD C3
          SB3    X1          B3 >  0 IF NOT 0 OR NEG ARGUMENT 
          NX7    X7 
          FX4    X7*X5       M*LOGE(2.) LOWER 
          FX6    X0*X0       T**2 
          SA5    A2+B1       LOAD C4
          FX1    X0+X0       2*T
          FX1    X4+X1       M*LOGE(2)+2*T
          SA3    A5+B1       LOAD C2
          FX2    X2*X6       C3*T**2
          FX4    X6*X6       T**4 
          RX3    X2+X3       C3*T**2+C2 
          FX5    X5*X4       C4*T**4
          SA2    A3+B1       LOAD C1
          FX0    X0*X6       T**3 
          RX3    X5+X3       C4*T**4+C3*T**2+C2=R 
          FX6    X2*X6       C1*T**2
          SA2    A2+B1       LOAD C0
          FX4    X3*X4       R*T**4 
          SA5    A2+B1       LOAD LOGE(2) UPPER 
          RX3    X6+X2       C1*T**2+C0 
          RX6    X4+X3       R*T**4+C1*T**2+C0=POLY 
          RX3    X6*X6       POLY**2
          SA4    B2          LOAD LOGE(Z0)
          RX0    X0*X3       T**3*POLY**2 
          GE     B0,B3,LOG4  IF BAD ARGUMENT
          FX7    X7*X5       M*LOGE(2)UPPER 
          RX2    X1+X0       2*T+T**3*POLY**2 
          RX1    X4+X2       LOG(Z0)+2*T+T**3*POLY**2 
          RX6    X7+X1       M*LOG(2)+LOG(Z0)+2*T+T**3*PLY**2 
          EQ     P.LN        RETURN 
  
 LOG3     SX0    LOGA        INFINITE OR INDEFINITE ARGUMENT
          EQ     =XP.SABRT   ABORT
  
 LOG4     SX0    LOGB        NEGATIVE OR ZERO ARGUMENT
          EQ     =XP.SABRT   ABORT
  
 LOGA     DATA   C* INFINITE OR INDEF ARGUMENT OF LN.*
  
 LOGB     DATA   C* ARGUMENT OF LN <= 0.0*
  
 LOGC     DATA   16530717363257120000B  LOG2 LOWER
          DATA   9.458758712636952E-2   C3
          DATA   7.336694749002597E-2   C4
          DATA   1.382213850374260E-1   C2
          DATA   2.449489737976310E-1   C1
          DATA   8.164965809281486E-1   C0
          DATA   17175427102775750000B  LOG2 UPPER
  
          DATA   60603313235735454443B  LOGE(0.5625)
          DATA   60610365565713543310B  LOGE(0.6250)
          DATA   60612002405610237526B  LOGE(0.6875)
          DATA   60613313235735454442B  LOGE(0.7500)
          DATA   60621266022606724460B  LOGE(0.8125)
          DATA   60623564161373540333B  LOGE(0.8750)
          DATA   60633675147224607057B  LOGE(0.9375)
 LOGD     DATA   00000000000000000000B  LOGE(1.0000)
          DATA   17147423407334253627B  LOGE(1.1250)
          DATA   17157107767617152322B  LOGE(1.2500)
          DATA   17165060613604161366B  LOGE(1.3750)
          DATA   17166371443731376303B  LOGE(1.5000)
          DATA   17167611217277274067B  LOGE(1.6250)
          DATA   17174364137274701006B  LOGE(1.7500)
          DATA   17175016617720431625B  LOGE(1.8750)
 LN       SPACE  4
          END 
