.TITLE LN .GLOBL .LN,.LOG,.CALL,.EXP,.LOG2 .MCALL .LN,.TLQ ;USES NEWTON-RAPHSON METHOD; BY JOSE DIAZ A0=R0 X=A0 A2=R2 A3=R3 Y=A3 ; .MACRO .LOG X,Y ;Y=LOG(X) BASE 10 YY: .BLKW 2 XX: .BLKW 2 .LOG: STF A0,-(SP) LDF XX,A0 STF A0,.LN-4 CALL .LN LDF .LN-10,A0 DIVF LN10,A0 STF A0,YY LDF (SP)+,A0 RETURN LN10: .FLT2 2.3025851 ;LN(10) BASE e ; .MACRO .LOG2 X,Y ;Y=LOG(X) BASE 2 YYY: .BLKW 2 XXX: .BLKW 2 .LOG2: STF A0,-(SP) LDF XXX,A0 STF A0,.LN-4 CALL .LN LDF .LN-10,A0 DIVF LN2,A0 STF A0,YYY LDF (SP)+,A0 RETURN LN2: .FLT2 0.69314718 ;LN(2) BASE e ; .MACRO .LN X,Y ;Y=LN(X), BASE e LNY: .BLKW 2 LNX: .BLKW 2 .LN: MOV R4,-(SP) STF A0,-(SP) STF A2,-(SP) STF A3,-(SP) LDF LNX,X ;ERROR IF X<= 0 CFCC BLE NEGERR CLR LNFLAG CMPF #1,X ;X>1? CFCC BGE DOLN ;IF X>1, FIND RECIPROCAL, SET FLAG INC LNFLAG ;SET FLAG FOR NUMBER >1 LDF #1,A2 ;FIND RECIPROCAL SO NOW X<1 DIVF X,A2 LDF A2,X DOLN: CALL FGLN ;FIND FIRST GUESS FOR Y ;NEWTON-RAPHSON METHOD. NEW GUESS: Y=Y-(EXP(Y)-X)/EXP(Y), 1E-38<=Y<1 MOV #20.,R4 ;NUMBER OF ITERATIONS LOOPLN: STF Y,.EXP-4 CALL .EXP LDF .EXP-10,A2 STF A2,-(SP) SUBF X,A2 ;A2=EXPY-X DIVF (SP)+,A2 ;A2=(EXPY-X)/EXPY NEGF A2 ADDF A2,Y ;A2=Y-(EXPY-A)/EXPY; Y IS NEW GUESS SOB R4,LOOPLN ;END OF ITERATIONS TST LNFLAG BEQ DONELN ;IF X WAS <1 WE DONE NEGF Y ;OTHERWISE NEGATE RESULT BECAUSE LNX=-LN(1/X) DONELN: STF Y,LNY LDF (SP)+,A3 LDF (SP)+,A2 LDF (SP)+,A0 MOV (SP)+,R4 RETURN NEGERR: .TLQ <.LN: LOG OF NEG OR ZERO> JMP .CALL ;SUBROUTINE FOR CHOOSING FIRST GUESS FOR NEWTON-RAPHSON METHOD FGLN: CMPF #1E-31,X ;FIND RANGE OF X AND CHOOSE APPROPRIATE CFCC ;FIRST GUESS BGT FGLN1 CMPF #1E-25,X CFCC BGT FGLN2 CMPF #1E-19,X CFCC BGT FGLN3 CMPF #1E-13,X CFCC BGT FGLN4 CMPF #1E-7,X CFCC BGT FGLN5 CMPF #0.1,X CFCC BGT FGLN6 LDF X,Y ;FOR X>0.1 WE CAN LET FIRST GUESS=X RETURN FGLN1: LDF #-71.4,Y ;LN 1E-31 RETURN FGLN2: LDF #-57.6,Y ;LN 1E-25 RETURN FGLN3: LDF #-43.7,Y ;LN 1E-19 RETURN FGLN4: LDF #-30,Y ;LN 1E-13 RETURN FGLN5: LDF #-16.1,Y ;LN 1E-7 RETURN FGLN6: LDF #-2.3,Y ;LN 0.1 RETURN LNFLAG: .BLKW 1 .END