File: ALOG.RA of Tape: Sources/Fortran/os8-f4-3
(Source file text)
/R=ALOG(R) SINGLE PREC. NATURAL LOGARITHM / / / VERSION 40A 26-MAY-80 WVDM / / SECT ALOG JA #ALOG 0 /WORKING SPACE FOR EXPONENT DIDDLE. 0 0 ALOGTM, 0 0 0 0 / EXTERN #ARGER ALOGER, TRAP4 #ARGER TEXT +ALOG + ALOGXR, SETX XRALOG SETB BPALOG BPALOG, F 0.0 XRALOG, F 0.0 ALOG1, F 0.0 ALOG2, F 0.0 F1ALOG, F 1. F2ALOG, F 2. / ALOGMG, 0 0 13 ALOGP1, 0 /CORRECT EXPONENT DIDDLERS 0 1 / ORG 10*3+BPALOG FNOP JA ALOGXR 0 ALGRTN, JA . / ALOGE2, 0 /.69314718 = LN(2) 2613 4414 / ALOGL1, 0 /.99999642 3777 7742 / ALOGL2, 7777 /-.49987411 4000 4100 / ALOGL3, 7777 /.33179903 2517 0310 / ALOGL4, 7776 /-.24073383 4113 7211 / ALOGL5, 7776 /.16765407 2535 3301 / ALOGL6, 7775 /-.09532939 4746 0771 / ALOGL7, 7774 /.03608850 2236 4304 / ALOGL8, 7771 /-.00645355 4544 1735 / BASE 0 #ALOG, STARTD FLDA 10*3 FSTA ALGRTN FLDA 0 SETX XRALOG SETB BPALOG BASE BPALOG LDX 1,1 FSTA BPALOG FLDA% BPALOG,1 /ADDR OF X FSTA BPALOG STARTF FLDA% BPALOG /GET X JLE ALOGER /IF =<0 THEN ERROR LDX -1,0 /IF >0 THEN START DOING FSTA ALOG1 /SAVE IN A TEMP. FSUB F1ALOG /KNOCK OFF ONE. JEQ ALGRTN /IF ZERO EXIT. LOG(1)=0 JGE ALOGST /IF POSITIVE LOG>0 FLDA F1ALOG /NEGATIVE. INVERT IT. FDIV ALOG1 /BY DIVIDING INTO ONE. FSTA ALOG1 LDX 0,0 /RESET SIGN TO NEGATIVE. JA .+3 /AVOID USELESS LOAD INSTRUCTION. / ALOGST, FLDA ALOG1 /RECALL NUMBER. FDIV F2ALOG /CUT IN HALF. FSTA ALOGTM /PREPARE FOR EXPONENT DIDDLE. FLDA ALOGMG /SET THE EXPONENT OF THE EXPONENT TO 13. FSTA ALOGTM-3 /SO THAT NORMALIZE WILL DO JOB. FSTA ALOGTM+1 /AND ALSO ZERO LOW ORDER PART OF EX. MANT. FLDA ALOGTM-1 /RECALL THE NUMBER FNORM /NORMALIZE IT. FMUL ALOGE2 /NOW MULTIPLY EXPONENT BY LOG E 2 FSTA ALOG2 /AND SAVE IT FOR A SECOND. FLDA ALOG1 /RECALL THE NUMBER AGAIN. FSTA ALOGTM /STORE IN THE TEMPORARY WORKER. FLDA ALOGP1 /RECALL WORD WITH LOW ORDER ONE. FSTA ALOGTM-2 /STORE AWAY. FLDA ALOGTM /RECALL NUMBER WITH AN EXPONENT OF 1 FSUB F1ALOG /SUBTRACT AWAY. FSTA ALOG1 /AND STORE FMUL ALOGL8 /MULTIPLY BY THE CONSTANT. FADD ALOGL7 /ADD IN FMUL ALOG1 /MULT. FADD ALOGL6 /AND SO ON DOWN THE LINE. FMUL ALOG1 FADD ALOGL5 FMUL ALOG1 FADD ALOGL4 FMUL ALOG1 FADD ALOGL3 FMUL ALOG1 FADD ALOGL2 FMUL ALOG1 FADD ALOGL1 FMUL ALOG1 FADD ALOG2 /CORRECT NOW.ADD IN EXPONENT. JXN ALGRTN,0 /EXIT IF SIGN IS OK. FNEG /ELSE NEGATE IT. JA ALGRTN