
	.TITLE DTRIGS
/COPYRIGHT 1969, DIGITAL EQUIPMENT CORP., MAYNARD, MASS.
/DOUBLE PRECISION TRIG FUNCTIONS
/
/	DSQRT		SQUARE ROOT
/	DATAN		ARCTANGENT
/	DEXP		NATURAL EXPONENTIAL
/	DLOG		NATURAL LOG
/	DLOG10		COMMON LOG
/	DSIN		SINE
/	DCOS		COSINE
/DSQRT	/COMPUTE THE SQUARE ROOT
/OF A D.P. ARG.
/
/
/--------------------
/
	.IFUND	%NDSQ
DSQRT	0
	JMS	%FG.
%DSQ10	0
	JMS	DLAC
	XCT	%DSQ10
	LAC	%FAC2	/GET SIGN WORD
	SPA!CLL		/IF NEGATIVE DISPLAY
	JMP	%DSQB	/ERROR 1
	ISZ	DSQRT
	SNA		/IF ZERO
	JMP*	DSQRT	/EXIT IMMEDIATELY
	LAC	%FAC1	/GET ARG EXPONENT
	SPA		/IF .LT.0 EXTEND EXPONENT
	STL
	RAR
	DAC	%DSQ1	/SET EXP OF CONSTANT (K)=EXP/2
	SNL		/WAS EXPONENT ODD?
	TAD	(-1	/NO...FAC1=EXP/2-1
	DAC	%FAC1	/EXP OF ARG = X/2 OR X/2-1
	JMS	DFAD	/DOUBLE PRECISION ADD
	.DSA	%DSQ1	/(ARG+K=P(0))
	LAW	-4	/SET ITERATION COUNTER
	DAC	%DSQ1
%DSQA	JMS	DDAC	/DOUBLE PRECISION STORE
	.DSA	%DSQ20	/(P(N))
	JMS	DDVR	/DOUBLE PRECISION REVERSE DIVIDE
	XCT	%DSQ10	/ARG/P(N))
	JMS	DFAD
	.DSA	%DSQ20	/(P(N) + (ARG/P(N)))
	LAW	-1	/EXP FROM ARITHMETIC
	TAD	%FAC1	/ABOVE=EXP-1
	DAC	%FAC1	/(DIVIDE ARG BY 2)
	ISZ	%DSQ1	/BUMP ITERATION COUNTER
	JMP	%DSQA	/LOOP BACK AGAIN
	JMP*	DSQRT	/DONE-EXIT
/
%DSQB	STL!GLK		/ERROR 1
	JMP*	DSQRT	/TRY AGAIN
			/STORAGE FOR INPUT
%DSQ20	0
	0
	0
%DSQ1	0
	200000
	0
	.ENDC
/
/--------------------
/
/COMPUTE LOG BASE 2 FOR DOUBLE ARGUMENT
/
/
	.IFUND	%NDLG
	.IFUND	%NDL10
%DLOGS	0
	LAC	%FAC2
	SNA!SPA
	JMP	%DLGA	/ERROR 2 IF.LT.0
	ISZ	%DLOGS	/OK POINT TO NORMAL EXIT
	LAC	%FAC1
	SNA		/CHECK FOR 1.0(SPECIAL CASE)
	JMP	%DLGAA
	AND	(777776
	SZA
	JMP	%DLGAA
	LAC	%FAC3
	SZA
	JMP	%DLGAA
	LAC	%FAC2
	SAD	(200000
	JMP	%DLOGZ
/
/
%DLGAA	LAW	-1	/GET EXP-1
	TAD	%FAC1
	DAC	%DLG2	/FOR INT DETERMINATION
	LAC	(1	/(1)
	DAC	%FAC1	/SET ARG EXP = 1 (1 .LE. F .LT. 2)
	DAC	%DLG4	/SET EXP OF SQRT (2) TO 1
	JMS	DFAD	/ADD DOUBLE
	.DSA	%DLG4	/ (F + SQRT(2)
	ISZ	%DLG4	/BUMP EXP FOR 2 + SQRT(2)
	JMS	DDAC	/STORE DOUBLE
	.DSA	%DLG5	/ (F+SQRT(2),
	JMS	DSUB	/SUBTRACT DOUBLE
	.DSA	%DLG4	/ (F+SQRT(2)-2*SQRT(2)=F-SQRT(2))
	JMS	DDVD	/DIVIDE DOUBLE
	.DSA	%DLG5	/ (F-SQRT(2) / F+SQRT(2))
	JMS	DPOLY	/POLYNOMIAL EVALUATE ABOVE
	.DSA	%DLG7	/ADDR OF CALLING SEQUENCE
	JMS	DDAC	/STORE DOUBLE
	.DSA	%DLG5	/ (RESULT TO TEMP)
	LAC	%DLG2	/GET INTEGER
	STL		/ADD 0.5
	RAL		/ (INTEGER * 2)
	JMS	%FLOT.	/FLOAT
	LAW	-1	/EXP = EXP-1 (INTEGER/2)
	TAD	%FAC1
	DAC	%FAC1
	JMS	DFAD	/ADD DOUBLE
	.DSA	%DLG5	/ (RESULT+INTEGER + 0.5)
	JMP*	%DLOGS	/EXIT
%DLOGZ	DZM	%FAC1
	DZM	%FAC2
	JMP*	%DLOGS
%DLGA	LAC	(2	/ERROR 2
	JMP*	%DLOGS	/ERROR-EXIT
%DLG2		0	/INTEGER STORAGE
%DLG5		0	/TEMP STORAGE	(1)
		0	/		(2)
		0	/		(3)
%DLG7		777775	/NO OF COEFF	(4)
	777777;	336256;	455134	/0.4342597513D0
	000000;	223466;	040146	/0.5765843421D0
	000000;	366161;	114432	/0.9618007623D0
	000002;	270524;	354400	/2.885390073D0
%DLG4		1	/ (X * SQRT(2))	(1)/ (X - 1 OR 2
		265011	/	   	(2)/ AND SET BY
		714640	/		(3)/ PROGRAM)
	.ENDC
	.ENDC
/
/--------------------
/
/DOUBLE PRECISION POLYNOMIAL EVALUATE
/
	.IFUND	%NDPOL
DPOLY	0
	LAC*	DPOLY		/GET PARAM ADDR.
	DAC	%DPOL1		/STORE AS POINTER
	LAC*	%DPOL1		/PICK UP (-N)
	DAC	%DPOL2
	ISZ	%DPOL1		/BUMP POINTER FOR C(N)
	ISZ	DPOLY		/BUMP EXIT ADDR.
	JMS	DDAC		/STORE DOUBLE
	.DSA	%DPOL4		/ (ARG)
	JMS	DMPY		/SQUARE THE INPUT ARG.
	.DSA	%DPOL4
	JMS	DDAC		/STORE DOUBLE
	.DSA	%DPOL6		/ (ARG2)
	JMS	DLAC		/LOAD DOUBLE
	XCT	%DPOL1		/ (C(N))
%DPOLA	JMS	DMPY		/MULTIPLY DOUBLE
	.DSA	%DPOL6		/ (ARG2*C(N))
	ISZ	%DPOL1		/POINTER = POINTER+3
	ISZ	%DPOL1
	ISZ	%DPOL1
	JMS	DFAD		/ADD DOUBLE
	XCT	%DPOL1		/(C(N-1)+(ARGXC(N)))
	ISZ	%DPOL2		/N=N+1
	JMP	%DPOLA		/MORE TERMS-CYCLE AGAIN
	JMS	DMPY		/DONE-MULTIPLY DOUBLE
	.DSA	%DPOL4		/ CUBE ARG.
	JMP*	DPOLY		/EXIT
%DPOL1		0		/POINTER
%DPOL2		0		/COUNTER
%DPOL4		0		/INPUT ARG (1)
		0		/   (2)
		0		/    (3)
%DPOL6		0		/BUILD RESULT (1)
		0		/     (2)
		0		/      (3)
	.ENDC
/
/--------------------
/
/
/DLOG	/COMPUTE THE NATURAL LOGARITHM
/OF A D P FLTING POINT ARG IN THE
/FLTING ACCUMULATOR.
/
/METHOD:	LOG(E)X=LOG(2)X*LOG(E)2
/
	.IFUND	%NDLG
DLOG	0
	JMS	%FG.
	0
	JMS	DLAC
	XCT	.-2
	JMS	%DLOGS	/GET LOG (2) ARG
	JMP*	DLOG	/ERROR EXIT
	JMS	DMPY	/LOG2(ARG)*LOGE(2)
	.DSA	%DLOG1
	ISZ	DLOG	/NORMAL EXIT
	JMP*	DLOG	/EXIT
%DLOG1		0	/LOG(E)2	(1) 0.6931471806
		261344	/	(2)
		137700	/	(3)
	.ENDC
/
/--------------------
/
/DLOG10	/COMPUTE COMMON LOGARITHM
/OF D P ARG IN THE FLTING ACC.
/
/METHOD:	 LOG(10) X = LOG(2)X * LOG(10)2
/
	.IFUND	%NDL10
DLOG10	0
	JMS	%FG.
	0
	JMS	DLAC
	XCT	.-2
	JMS	%DLOGS	/COMPUTE LOG(2) ARG
	JMP*	DLOG10
	JMS	DMPY
	.DSA	%DLG10
	ISZ	DLOG10
	JMP*	DLOG10	/EXIT
%DLG10	777777		/LOG(10)2 (1) 0.3010299957
	232101		/	 (2)
	152052		/	 (3)
	.ENDC
/
/--------------------
/
/DATAN	/COMPUTE THE ARCTANGENT
/OF A D.P. FLTING POINT VALUE.
/
	.IFUND	%NDTAN
DATAN	0
	JMS	%FG.
	0
	JMS	DLAC
	XCT	.-2
	LAC	%FAC2	/GET SIGN WORD
	DAC	%DTN2	/SAVE AS ANS SIGN
	AND	(377777	/STRIP SIGN
	DAC	%FAC2
	LAC	%FAC1	/GET EXPONENT
	DAC	%DTN5	/SAVE FOR LATER TEST
	SNA!SPA		/IF (ARG .GT. 1) TAKE 1/ARG
	JMP	%DATNA	/OR SKIP TO POLY EVALUTE
	JMS	DDVR	/REVERSE DIVIDE DOUBLE
	.DSA	%DTN8	/1/ARG
%DATNA	JMS	DDAC	/SAVE ARGUMENT
	.DSA	%DTN20
	JMS	DPOLY	/POLYNOMIAL EVALUATE
	.DSA	%DTN11
	JMS	DDAC	/SAVE INTERMEDIATE ANGLE
	.DSA	%DTN21
	JMS	%DSIN	/CALCULATE TENGENT OF INTERMEDIATE ANGLE
	NOP
	JMS	DDAC	/TAN (A)=SIN ((PI/2)-A)
	.DSA	%DTN22
	JMS	DLAC
	.DSA	%DTN14
	JMS	DSUB
	.DSA	%DTN21
	JMS	%DSIN
	NOP
	JMS	DDVR
	.DSA	%DTN22
	JMS	DDAC	/SAVE TANGENT OF INTERMEDIATE ANGLE
	.DSA	%DTN22
	JMS	DMPY	/CALCULATE CORRECTION ANGLE TO BRING
	.DSA	%DTN20	/INTERMEDIATE ANGLE TO DESIRED ACCURACY
	JMS	DFAD	/C.A.=(ARG-TAN(A))/(1+ARG*TAN(A))
	.DSA	%DTN8
	JMS	DDAC
	.DSA	%DTN24
	JMS	DLAC
	.DSA	%DTN20
	JMS	DSUB
	.DSA	%DTN22
	JMS	DDVD	/C.A. NOW IN FLOATING AC.
	.DSA	%DTN24
	JMS	DFAD	/ADD INTERMEDIATE ANGLE TO CORRECTION
	.DSA	%DTN21	/ANGLE TO GET FINAL ANGLE
	LAC	%DTN5	/TEST ARG AGAIN IF .GT. 1 (EXP .GT. 0)
	SNA!SPA		/ (EXP POSITIVE AND NON-ZERO)
	JMP	%DATNB	/IS NOT .GT. 1, SKIP
	JMS	DSBR	/REVERSE SUBTRACT DOUBLE
	.DSA	%DTN14	/ (PI/2-ANS)
%DATNB	LAC	%DTN2	/GET ORIGINAL SIGN WORD
	AND	(400000	/KEEP BIT 0 ONLY
	XOR	%FAC2	/SET SIGN WORD WITH NEW SIGN
	DAC	%FAC2	/RESTORE SIGN WORD
	JMS	%FNOR.
	JMP*	DATAN
%DTN2	0	/ANS SIGN
%DTN5	0	/EXP STORAGE
%DTN8	1	/FLOATING 1 	(1)
	200000	/	    (2)
	0	/		(3)
%DTN14	1	/PI/2(1) (1.57079632679)
	311037	/      (2)
	552420	/      (3)
%DTN20	0	/TEMP STORAGE
	0
	0
%DTN21	0
	0
	0
%DTN22	0
	0
	0
%DTN24	0
	0
	0
%DTN11	777775		/NO OF COEFFICIENTS
	777774;	637556;	023444	/-0.389929D-1
	777776;	225623;	041646	/ 0.1462766D0
	777777;	644343;	720712	/ -0.3211819D0
	000000;	377631;	067426	/0.9992150D0
	.ENDC
/
/--------------------
/
/DCOS	/COMPUTE THE APPROX COSINE
/OF A D. P. FLT POINT VALUE IN
/THE FLTING ACCUMULATOR.
/
/METHOD: COS X=SIN (PI/2+X)
/
	.IFUND	%NDCOS
DCOS	0
	JMS	%FG.
	0
	JMS	DLAC
	XCT	.-2
	JMS	DFAD	/DOUBLE ADD PI/2
	.DSA	%DCOS1	/TO THE ARG AND
	JMS	%DSIN	/COMPUTE SIGN
	JMP*	DCOS	/ERROR EXIT
	ISZ	DCOS	/POINT TO
	JMP*	DCOS	/NORMAL EXIT
%DCOS1	1		/(PI/2) (1)
	311037		/       (2)
	552424		/       (3)
	.ENDC
/
/--------------------
/
/DSIN	/COMPUTE THE SINE
/
	.IFUND	%NDSIN
DSIN	0
	JMS	%FG.
	0
	JMS	DLAC
	XCT	.-2
	JMS	%DSIN
	JMP*	DSIN
	ISZ	DSIN	/POINT TO NORMAL
	JMP*	DSIN	/EXIT
	.ENDC
/
/--------------------
/
/COMPUTE SINE OF
/D P ARG IN THE FLOATING
/ACCUMULATOR.
/
	.IFUND	%NDCOS
	.IFUND	%NDSIN
	.IFUND	%NDTAN
%DSIN	0
	LAC	%FAC2	/GET SIGN WORD
	AND	(400000
	DAC	%DSIN1	/SAVE SIGN (ANS SIGN)
	LAC	%FAC2
	AND	(377777	/STRIP OFF SIGN BIT
	DAC	%FAC2	/PUT BACK ABSOLUTE VALUE
	JMS	DMPY	/MULTIPLY DOUBLE
	.DSA	%DSN20	/(2/PI * ARG)
	JMS	DDAC	/STORE DOUBLE
	.DSA	%DSN10	/(TEMP)
	JMS	%FUNF.	/UNFLOAT 
	JMP*	%DSIN	/ERROR EXIT
	DAC	%DSIN2	/SAVE FOR QUADRANT DETERMINATION
	JMS	%FLOT.	/FLOAT 
	JMS	DSBR	/REVERSE SUBTRACT DOUBLE
	.DSA	%DSN10	/(TEMP(ARG*2/PI)-ACC(INT ARG*2/PI) FOR FRACTN.
	LAC	%DSIN2	/GET INTEGER
	RCR		/BIT 17 TO LINK
	SNL		/IF SET COMPUTE 1-F (QUAD II OR IV)
	JMP	%DSINA	/OR TEST BIT 16
	JMS	DSBR	/REVERSE SUBTRACT DOUBLE
	.DSA	%DSIN3	/(1-F)
%DSINA	LAC	%DSIN2	/GET INTEGER AGAIN
	RTR		/BIT 16 TO LINK
	SNL		/IF SET-NEG ANS (QUAD III OR IV)
	JMP	%DSINB	/ COMPUTE THE POLY
	LAC	(400000	/GET ANS SIGN BIT
	XOR	%DSIN1	/CHANGE IT
	DAC	%DSIN1	/PUT IT BACK
%DSINB	JMS	DPOLY	/POLY EVALUATE
	.DSA	%DSINC	/NO OF COEFFS.
	LAC	%FAC2	/GET SIGN WORD OF ANS
	AND	(377777
	XOR	%DSIN1	/INSERT SIGN
	DAC	%FAC2
	ISZ	%DSIN	/NORMAL
	JMS	%FNOR.
	JMP*	%DSIN	/EXIT
/THE COEFFICIENTS ARE
%DSINC	777772
	777750; 351732; 333236 /0.54465285D-7
	777756; 761211; 460000 /-0.3595184353D-5
	777764; 250166; 553372 /0.16043839964D-3
	777771; 631322; 620016 /-0.4681752998D-2
	777775; 243153; 614634 /+0.796926260D-1
	000000; 645273; 634612 /-0.6459640975D0
	000001; 311037; 552422 /+1.57079632680D0
%DSIN1	0
%DSIN2	0
%DSN10	0
	0
	0
%DSN20	0		/(2/PI) (1)
	242763		/       (2)
	015566		/       (3)
%DSIN3	1		/FLOATING 1.0 (1)
	200000		/             (2)
	0		/             (3)
	.ENDC
	.ENDC
	.ENDC
/
/--------------------
/
/DEXP	/COMPUTE NATURAL EXPONEMTIAL
/OF A D. P. FLTING POINT NUMBER IN THE ACC.
/
	.IFUND	%NDEXP
DEXP	0
	JMS	%FG.
	0
	JMS	DLAC
	XCT	.-2
	LAC	%FAC2	/GET SIGN WORD
	DAC	%DEXP1	/SAVE SIGN OF ARG
	AND	(377777	/GET THE ABSOLUTE VALUE
	DAC	%FAC2
	JMS	DMPY
	.DSA	%DEX10	/ARG *LOG2 (E))
	JMS	DDAC	/STORE DOUBLE
	.DSA	%DEX20	/(TEMP)
	JMS	%FUNF.	/UNFLOAT PRODUCT
	JMP*	DEXP
	DAC	%DEX30	/STORE INT AS ANS EXPONENT
	ISZ	%DEX30	/BUMP EXPONENT FOR .5 SCALING
	JMS	%FLOT.	/FLOAT THE INTEGER
	JMS	DSBR	/REVERSE SUBTRACT DOUBLE
	.DSA	%DEX20	/(TEMP - FAC) FRACTION ONLY (F)
	JMS	DDAC	/STORE DOUBLE
	.DSA	%DEX20	/(F  INTO TEMP)
	LAW	-10	/SET ITERATION CNTR FOR 9 PASSES
	DAC	%DEXP2
	LAC	%DEXD	/GET ADDRESS OF  COEFFICIENTS
	DAC	%DEXP3	/SAVE IT AS A POINTER
	JMS	DLAC	/LOAD 
	.DSA	%DEXC	/C(9) AS TERM
%DEXPA	JMS	DMPY	/MULTIPLY DOUBLE
	.DSA	%DEX20	/(F*TERM)
%DEXPB	ISZ	%DEXP3	/POINT TO THE NEXT
	ISZ	%DEXP3
	ISZ	%DEXP3
	JMS	DFAD	/ADD DOUBLE
	XCT	%DEXP3	/C (PTR) AS NEW TERM
	ISZ	%DEXP2	/INCREMENT COUNTER
	JMP	%DEXPA	/NOT DONE CYCLE AGAIN
	JMS	DDAC	/DONE
	.DSA	%DEX20	/(RESULT TO TEMP)
	JMS	DMPY
	.DSA	%DEX20	/(RESULT*RESULT)
	JMS	DMPY
	.DSA	%DEX30	/(EXPONENT* FINAL RESULT)
	ISZ	DEXP	/NORMAL EXIT
	LAC	%DEXP1	/IF THE INPUT
	SMA		/ARG WAS .LT.0
	JMP*	DEXP	/GET ITS RECIPROCAL
	JMS	DDVR
	.DSA	%DEXP4	/BEFORE EXITING
	JMP*	DEXP
%DEXC	777745;	261767;	414110	/0.5180D-8
	777752;	200334;	225756	/0.119610D-6
	777756;	241410;	444530	/0.2406787D-5
	777762;	256607;	213216	/0.41667033D-4
	777766;	235452;	556272	/0.601133075D-3
	777771;	343260;	433536	/0.6938013677D-2
	777774;	365773;	677740	/0.6005662674D-1
	777777;	261344;	137700
%DEXP4     1;	200000;	000000	/1.0D0
%DEXD	.DSA	%DEXC
%DEXP1	0
%DEXP2	0			/COUNTER
%DEXP3	0			/POINTER
%DEX10	1			/LOG2 (E)  (1)
	270524			/	 (2)
	354514			/	 (3)
%DEX20	0
	0
	0
%DEX30	0
	200000
	0
	.ENDC
	.EOT
