/ SQRT -- SQUARE ROOT / FOR 23 BIT F. P. FORMAT / WRITTEN BY / PHILLIP SIEMENS / LAWRENCE LIVERMORE LABORATORY / SEPTEMBER 9, 1975 / USE THE APPROXIMATION / Y = X0 + (Y/X0)/2 / INITIAL X0 IS CHOSEN BY / MANTISSA = (MANTISSA + 2**23) / 2 IF EXP IS EVEN / MANTISSA = (MANTISSA + 2**22) / 2 IF EXP IS ODD / EXPONENT = EXP/2 IF EXP IS EVEN / EXPONENT = EXP/2 + 1 IF EXP IS ODD LAP / DEFINITIONS TO MAKE THINGS RUN FAST OPDEF TADI 1400 OPDEF JMPI 5400 OPDEF DCAI 3400 OPDEF ISZI 2400 ENTRY SQRT / TEMPORARY STORAGE X0, 0 X1, 0 X2, 0 Y, 0 Y1, 0 Y2, 0 CNT, 0 //////////// SQER, 6321 /"SQRT" ERROR FROM LOC XXXXX 2224 SQRT, 6140 /VERSION # IN ENTRY POINT 0005 /EDIT # TAD SQRT /GET CDF TO FROM FIELD DCA SQRT1 /PUT IT HER SQRT1, HLT /CHANGE DF TO FROM TADI SQRT# /GET FIELD OF ARG DCA SQRT2 ISZ SQRT# /BUMP POINTER CLA CMA TADI SQRT# /GET ADDRESS OF ARG DCA 10 /INIT AUTO INDEX ISZ SQRT# /BUMP POINTER SQRT2, HLT /CHANGE DF TO ARG FIELD TADI 10 /GET MS OF ARG DCA Y /STORE IN Y TADI 10 DCA Y1 TADI 10 DCA Y2 TAD Y /GET SIGN OF ARG SMA /NEGATIVE? JMP POS /NO CALL 1, ERROR /ERROR ARG SQER TAD Y1 /CHANGE SIGN OF Y TO POSITIVE CLL CIA DCA Y1 CML RAL TAD Y CLL CIA DCA Y JMP NONZ ///////////// POS, SNA CLA /IS ARG ZERO? JMP SQZERO /YES -- ROOT = 0 NONZ, CLL /FORM INITIAL X0 TAD Y2 /GET EXPONENT SPA /NEGATIVE? CML /YES -- GET A 1 IN LINK RAR /DIVIDE EXPONENT BY 2 DCA ACL /SET EXPONENT IN FAC SZL /WAS EXP EVEN? ISZ ACL /NO -- ADD 1 TO EXP NOP CML /NOW FIX THE MANTISSA SNL CML RAR RAR TAD Y /DIVIDE BY 2 RAR DCA ACH TAD Y1 RAR DCA ACM CLA CMA CLL RTL DCA CNT /DO 3 ITERATIONS INIT, TADI (20 /SAVE FAC IN X0 DCA X0 TADI (21 DCA X1 TADI (22 DCA X2 TAD Y /PUT Y INTO FAC DCAI (20 TAD Y1 DCAI (21 TAD Y2 DCAI (22 CALL 1, FDV / Y/X0 ARG X0 CALL 1, FAD / ( Y/X0 ) + X0 ARG X0 CLA CMA TAD ACL / (( Y/X0 ) + X0 ) / 2 DCA ACL ISZ CNT JMP INIT SQRN, CLA CLL CML RTL /FAST RETURN TAD SQRT DCA SQRTR SQRTR, HLT JMPI SQRT# SQZERO, DCA ACH /ZERO FAC DCA ACM DCA ACL JMP SQRN END