/27-BIT EXTENDED FUNCTIONS /5-23-72 R BEAN /COPYRIGHT 1972 DIGITAL EQUIPMENT CORPORATION,MAYNARD, MASS. 01754 /DEC-08-NFPEA-A VERSION 1 EXP=44 HORD=45 LORD=46 FIXFLT=5500 *FIXFLT /******FIX****** /ROUTINE TO FIX ANY FLOATING NUMBER IN FAC BETWEEN -2047 AND +2047 TO /A TWELVE BIT INTEGER AND LEAVE RESULT IN EXP (LOC 44) FFIX, 0 JMS I SPLITA /SPLIT UP FAC (UNPACK IT) DCA I SPLTFK /CLEAR SPLIT FLAG!! TAD EXP /FETCH EXPONENT TAD FTRPRT /SUBTRACT THE BIAS SZA SMA /IS NUMBER <1? JMP .+3 /NO-CONTINUE ON FTRPRT, 7600 /CLA=-200 JMP FIXDNE /YES-FIX IT TO ZERO TAD M13 /SET BINARY POINT AT 11 PLACES TO SMA SZA /RIGHT OF CURRENT POINT IS # TOO BIG? JMP I OTRAPA /YES-TAKE OVERFLOW TRAP TAD M4 /NO-ADD 4 SINCE AC1 HAS SOME BITS DCA EXP /SET SCALE COUNT FIXLP, JMS I AR1A /SHIFT FAC RIGHT 1 PLACE DCA LORD /ZERO LORD SO OV WILL BE 0 ISZ EXP /DONE YET? JMP FIXLP /NO TAD TM /YES-PUT SIGN OF MANTISSA CLL RAL /IN LINK TAD HORD /GET HIGH ORDER MANTISSA SZL /WAS ORIGINAL # NEGATIVE? CLL CMA IAC /YES-NEGATE THIS AND CLR. LINK FIXDNE, DCA EXP /RETURN WITH ANSWER IN 44 JMP I FFIX /RETURN M4, -4 /-4 DECIMAL M13, -13 /-11 DECIMAL /******FLOAT****** /ROUTINE TO FLOAT ANY INTEGER IN EXP (LOC 44) INTO FAC FFLOAT, 0 CLL TAD EXP SPA /IS IT NEGATIVE? CML CMA IAC /YES-MAKE POSITIVE AND SET LINK DCA HORD /PUT NUMBER IN HI MANTISSA DCA LORD /CLEAR LOW MANTISSA RAR /ROTATE SIGN FROM LINK TAD C2170 /15(10)+ SIGN INTO EXPONENT DCA EXP JMS I FNORL /NORMALIZE JMP I FFLOAT /RETURN FNORL, FFNOR /LINK TO NORMALIZE ROUTINE C2170, 2170 /15 DECIMAL OTRAPA, FTRP1 /ADDRESS OF VECTOR FOR OVERFLOW TRAP LOGC5, 2004 /.59897865 6253 2522 LN2, 2005 /.69314718 4271 0300 TOVPI, 2005 /.6366198 = 2/PI 0574 6033 TEMP1, 0 0 0 TEMP2, 0 /TWO TEMP STORAGE BLOCKS FOR FUNCTIONS 0 0 SPLTFK, SPLTFG SPLITA, SPLIT AR1A, AR1 *FIXFLT-500 /******SINE****** SIN, 0 JMS NHNDLE /IF X<0,NEGATE X AND SET NFLAG JMS I FMPYL /X*2/PI TOVPI JMS FRACT /SAVE X IN TEMP1,THE INTEGER PART OF X IN NUM,AND GET FRACTIONAL PART IN FAC TAD NUM /GET INTEGER PART OF (2/PI)*X AND C3 /ISOLATE BITS 10,11 TAD JMPI DCA .+1 /MAKE JUMP TO ARGUMENT REDUCING ROUTINE JMP . /AND ADJUST ARG ACCORDING TO QUADRANT OF X JMPI, JMP I QDTBL QUAD2, JMS I FSUB1L /1-X ONE JMP POLYSN /CALCULATE SIN(1-X) QUAD3, JMS I FNEGL /-X JMP POLYSN /CALCULATE SIN(-X) QUAD4, JMS I FSUBL /X-1 ONE POLYSN, JMS I FPUTL /SAVE X TEMP1 JMS I FSQRL /U=X**2 JMS I FPUTL /SAVE U TEMP2 JMS I FMPYL /A9(U) SINA9 JMS I FADDL /A7+A9(U) SINA7 JMS I FMPYL /A7(U)+A9(U**2) TEMP2 JMS I FADDL /A5+A7(U)+A9(U**2) SINA5 JMS I FMPYL /A5(U)+A7(U**2)+A9(U**3) TEMP2 JMS I FADDL /A3+A5(U)+A7(U**2)+A9(U**3) SINA3 JMS I FMPYL /A3(U)+A5(U**2)+A7(U**3)+A9(U**4) TEMP2 JMS I FADDL /A1+A3(U)+A5(U**2)+A7(U**3)+A9(U**4) PIOV2 JMS I FMPYL /A1(X)+A3(X**3)+A5(X**5)+A7(X**7)+A9(X**9) TEMP1 JMS NCHK /IF NFLAG IS SET,SET SIN(X)=-SIN(X) JMP I SIN /FAC=SIN(X) /******COSINE****** /USES SIN ROUTINE TO CALCULATE COS(X) COS, 0 JMS I FADDL /COS(X)=SIN(PI/2+X) PIOV2 JMS SIN JMP I COS /RETURN QDTBL, POLYSN /X IN QUAD1,SIN(X)=SIN(X) QUAD2 /X IN QUAD2,SIN(X)=SIN(1-X) QUAD3 /X IN QUAD3,SIN(X)=SIN(-X) QUAD4 /X IN QUAD4,SIN(X)=SIN(X-1) FGETL, FFGET FADDL, FFADD FMPYL, FFMPY FPUTL, FFPUT FDIVL, FFDIV FSUB1L, FFSUB1 FNEGL, FFNEG FSUBL, FFSUB FSQRL, FFSQ FIXL, FFIX FLOATL, FFLOAT FDIV1L, FFDIV1 C3, 3 /ROUTINE TO SEPERATE THE INTEGER AND FRACTIONAL PARTS OF FAC /ORIGINAL FAC IS SAVED IN TEMP1,THE INTEGER PORTION OF FAC IS /SAVED AT NUM,AND THE FRACTIONAL FORTION OF THE FAC IS LEFT IN THE FAC FRACT, 0 JMS I FPUTL /SAVE X TEMP1 JMS I FIXL /INTEGER PORTION OF X TAD EXP DCA NUM /SAVE FIXED FORTION OF X JMS I FLOATL /FAC=FLOAT(FIX(X)) JMS I FSUB1L /FAC=X-INT(X)=FRACTION (X) TEMP1 JMP I FRACT /RETURN /ROUTINE TO CHECK IF FAC<0; IF IT IS,FAC IS NEGATED AND NFLAG IS /SET TO 1 NHNDLE, 0 TAD EXP /GET SIGN OF MANTISSA SMA CLA /IS IT <0? JMP NFLGST /NO-CLEAR NFLAG JMS I FNEGL /YES-NEGATE FAC IAC /AND SET NFLAG NFLGST, DCA NFLAG JMP I NHNDLE /ROUTINE TO NEGATE FAC IF NFLAG IS NOT =0 NCHK, 0 /LOC ALSO USED FOR TEMP STORAGE TAD NFLAG SZA CLA /IS NFLAG=0? JMS I FNEGL /NO-NEGATE FAC JMP I NCHK /YES-RETURN NUM=NCHK SPLITZ, SPLIT STICKZ, STICK KK10, 10 *SIN+135 /******EXPONENTIAL****** EXPON, 0 /LOC USED FOR TEMP STORAGE BY SIN,ARCTAN JMS I FMPYL /Y=XLOG2(E) LOG2E JMS FRACT /GET FRACTIONAL PART OF Y JMS I FMPYL /(FRACTION(Y))*(LN2/2) LN2OV2 JMS I FPUTL /SAVE Y TEMP1 JMS I FSQRL /Y**2 JMS I FADDL /B1+Y**2 EXPB1 JMS I FDIV1L /A1/(B1+Y**2) EXPA1 JMS I FADDL /A0+A1/(B1+Y**2) EXPA0 JMS I FSUBL /A0-Y+A1/(B1+Y**2) TEMP1 JMS I FPUTL /SAVE TEMP2 JMS I FGETL /GET Y TEMP1 TAD KK10 /MULT BY 2=2Y TAD EXP DCA EXP /(DONE BY ADDING 1 TO EXP.) JMS I FDIVL /2Y/(A0-Y+A1/(B1+Y**2)) TEMP2 JMS I FADDL /1+2Y/(AO-Y+A1/(B1+Y**2)) ONE JMS I FSQRL /[1+2Y/(A0-Y+A1/(B1+Y**2))]**2=EXP(Y) JMS I SPLITZ /SPLIT FAC TAD NUM TAD EXP /EXP(X)=(2**N)(EXPY) DCA EXP JMS I STICKZ /REPACK FAC JMP I EXPON /FAC=EXPON(X) NFLAG=EXPON *SIN+200 /******ARC TANGENT****** ATAN, 0 JMS I NHNDLL /IF X<0,SET NFLAG AND NEGATE JMS I FPUTM /SAVE X TEMP1 JMS I FSUBM /X-1 ONE TAD EXP /GET SIGN OF MANTISSA SPA CLA /WAS X>1? JMP ARGPOL /NO-CLEAR GT1FLG JMS I FGETM /YES-ATAN(X)=PI/2-ATAN(1/X) ONE JMS I FDIVM /1/X TEMP1 JMS I FPUTM TEMP1 IAC /SET GT1FLG ARGPOL, DCA GT1FLG JMS I FGETM /GET X OR 1/X TEMP1 JMS I FSQRM /Y**2 JMS I FPUTM /SAVE TEMP2 JMS I FADDM /Y**2+B3 ATANB3 JMS I FDIV1M /A3/(Y**2+B3) ATANA3 JMS I FADDM /B2+A3/(Y**2+B3) ATANB2 JMS I FADDM /Y**2+B2+A3/(Y**2+B3) TEMP2 JMS I FDIV1M /A2/(Y**2+B2+A3/(Y**2+B3)) ATANA2 JMS I FADDM /B1+A2/(Y**2+B2+A3/(Y**2+B3)) ATANB1 JMS I FADDM /Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3)) TEMP2 JMS I FDIV1M /A1/(Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3))) ATANA1 JMS I FADDM /B0+A1/(Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3))) ATANB0 JMS I FMPYM /ATAN(Y)=X*(B0+A1/(Y**2+B1+A2/(Y**2+B2+A3/(Y**2+B3)))) TEMP1 TAD GT1FLG /WAS X>1? SNA CLA JMP NGT /NO-TEST IF X<0? JMS I FSUB1M /ATAN(X)=PI/2-ATAN(1/X) PIOV2 NGT, JMS I NCHKL /IF NFLAG SET,NEGATE FAC JMP I ATAN /FAC=ATAN(X) NHNDLL, NHNDLE NCHKL, NCHK /******NAPERIAN LOGARITHM****** GTFLG=ATAN LOG, 0 TAD EXP SPA SNA /X<0 OR X=0? JMP I ARTRAP /YES-TAKE ILLEGAL ARGUMENT TRAP TAD M2014 /IS EXP=2014? SNA TAD HORD /YES-IS HORD=0? SNA TAD LORD /YES-LORD=0? SZA CLA JMP POLYNL /NO-ARG IS LEGAL AND NOT 1 LTRPRT, DCA EXP JMP I LOG /YES-LOG(1)=0 POLYNL, JMS I SPLITS /SPLIT UP FAC TAD EXP /GET TRUE EXPONENT TAD M200 DCA GTFLG /SAVE EXPONENT FOR LATER TAD KK200 DCA EXP /ISOLATE MANTISSA IN FAC JMS I STICKS /REPACK FAC JMS I FPUTM /SAVE F TEMP1 JMS I FADDM /F+SQR(.5) SQRP5 JMS I FPUTM /SAVE TEMP2 JMS I FGETM TEMP1 JMS I FSUBM /F-SQR(.5) SQRP5 JMS I FDIVM /Z=F+SQR(.5)/F-SQR(.5) TEMP2 JMS I FPUTM TEMP1 JMS I FSQRM /Z**2 JMS I FPUTM TEMP2 JMS I FMPYM /C5(Z**2) LOGC5 JMS I FADDM /C3+C5(Z**2) LOGC3 JMS I FMPYM /C3(Z**2)+C5(Z**4) TEMP2 JMS I FADDM /C1+C3(Z**2)+C5(Z**4) LOGC1 JMS I FMPYM /C1(Z)+C3(Z**3)+C5(Z**5) TEMP1 JMS I FSUBM /C1(Z)+C3(Z**3)+C5(Z**5)-1/2=LOG2(F) ONEHAF JMS I FPUTM /SAVE LOG2(F) TEMP2 TAD GTFLG /I DCA EXP /SET UP FLOAT JMS I FLOATM JMS I FADDM /I+LOG2(F) TEMP2 JMS I FMPYM /[I+LOG2(F)]*LOGE(2)=LOGE(X) LN2 JMP I LOG /FAC=LN(X) GT1FLG=LOG FPUTM, FFPUT FMPYM, FFMPY FADDM, FFADD FDIVM, FFDIV FDIV1M, FFDIV1 FSUBM, FFSUB FSUB1M, FFSUB1 FSQRM, FFSQ FLOATM, FFLOAT FGETM, FFGET ARTRAP, FTRP3 M2014, -2014 SPLITS, SPLIT M200, -200 KK200, 200 STICKS, STICK /CONSTANTS USED BY VARIOUS FUNCTIONS PIOV2, 2016 /1.57079633 2207 7325 SINA3, 6005 /-0.645963711 1256 7405 SINA5, 1755 /.079689679 0632 1276 SINA7, 5714 /-.00467376557 6223 1430 SINA9, 1644 /.00015148419 7553 6723 LOG2E, 2015 /1.442695 6125 0731 LN2OV2, 1775 /.34657359027 4271 0300 EXPB1, 2067 /60.0901907 4056 1326 EXPA1, 6124 /-601.804267 5471 5711 EXPA0, 2046 /12.01501675 0036 6021 ATANB0, 1765 /.174655439 4554 3400 ATANA1, 2027 /3.70925626 3262 1643 ATANB1, 2036 /6.7621392 6061 5620 ATANA2, 6037 /-7.10676005 0665 2236 ATANB2, 2026 /3.31633543 5037 3266 ATANA3, 5774 /-.264768620 1707 7005 ATANB3, 2015 /1.44863154 6266 3017 SQRP5, 2005 /.707106781 5202 3630 LOGC1, 2025 /2.88539129 6125 1002 LOGC3, 2007 /.961470632 5421 3603 ONE, 2014 /1 0 0 ONEHAF, 2004 /.5 0 0 FFSIN=SIN FFCOS=COS FFATN=ATAN FFLOG=LOG FFEXP=EXPON PAUSE