perm filename LSPTRG[LSP,BGB]1 blob sn#033855 filedate 1973-04-07 generic text, type T, neo UTF8
00100	TITLE LSPTRG - LISP TRIG FUNCTIONS - BGB - 7 APRIL 1973.
00200		EXTERN NUMVAL,MAKNUM
00300	
00400	;ALTERNATE PDP-10 MNEMONICS.
00500		OPDEF LAC[MOVE]↔OPDEF DAC[MOVEM]↔OPDEF GO[JRST]
00600		OPDEF LACM[MOVM]↔OPDEF LACN[MOVN]↔OPDEF DAP[HRRM]
00700	;LISP CONVENTIONS.
00800		DEFINE SUBR(NAME){INTERN NAME↔NAME:}
00900		DEFINE ARG1<1>
01000		DEFINE ARG2<2>
01100		DEFINE POP1J<GO POP1J.>
01200		DEFINE POP2J<GO POP2J.>
01300	
01400		HALFPI:	201622077325 ;PI/2
01500		PI:	202622077325
01600	
01700	INTERN SIN,COS
01800	BEGIN SINCOS
01900		A←1 ↔ B←2 ↔ C←3
02000	↑COS:	PUSHJ 14,NUMVAL
02100		HRLI 2,(<MOVEI 2,>)↔CAME 2,MAKNUM+2↔GO[FSC 1,233
02200		FMPR 1,[0.017453292]↔GO .+1]
02300		FADR A,HALFPI↔GO SIN+4	;COS(X) = SIN(X+π/2).
02400	↑SIN:	PUSHJ 14,NUMVAL
02500		HRLI 2,(<MOVEI 2,>)↔CAME 2,MAKNUM+2↔GO[FSC 1,233
02600		FMPR 1,[0.017453292]↔GO .+1]
02700		MOVM B,A↔CAMG B,[17B5]↔POP1J	;FOR SMALL X, SIN(X)=X.
02800	
02900	;B ← (ABS(X)MODULO 2π)/HALFPI
03000	;C ← QUADRANT 0, 1, 2 OR 3.
03100		FDVR B,HALFPI
03200		LAC C,B↔FIX C,233000
03300		CAILE C,3↔GO[
03400		TRZ C,3↔FSC C,233
03500		FSBR B,C↔GO .-3]		;MODULO 2π.
03600		GO .+1(C)↔GO .+4↔JFCL↔GO[
03700		FSBRI B,(2.0)↔MOVNS B↔GO .+2]	;SIN(X+π)=SIN(-X)
03800		FSBRI B,(4.0)			;SIN(X+2π)=SIN(X)
03900		SKIPGE A↔MOVNS	B		;SIN(-X) = -SIN(X).
04000	
04100	;FOR -1 ≤ B ≤ +1 REPRESENTING -π/2 ≤ X ≤ +π/2,
04200	;COMPUTE SINE(X) APPROXIMATION BY TAYLOR SERIES.
04300		DAC B,C↔FMPR B,B	
04400		LAC A,[164475536722]↔FMP A,B
04500		FAD A,[606315546346]↔FMP A,B
04600		FAD A,[175506321276]↔FMP A,B
04700		FAD A,[577265210372]↔FMP A,B
04800		FAD A,HALFPI↔FMPR A,C↔POP1J
04900		LIT
05000	BEND
     

00100	;ACOS(X)= π/2 - ASIN(X).
00200	;GIVEN -1 ≤ X ≤ +1 RETURN 0 ≤ ACOS(X) ≤ +π.
00300	SUBR(ACOS)
00400	BEGIN ACOS
00500		PUSHJ 14,ASIN
00600		PUSHJ 14,NUMVAL
00700		MOVNS 1↔FADR 1,HALFPI
00800		POP1J
00900	BEND
01000	
01100	;ASIN(X)=ATAN(X/SQRT(1-X↑2)).
01200	;GIVEN -1 ≤ X ≤ +1 RETURN -π/2 ≤ ASIN(X) ≤ +π/2.
01300	SUBR(ASIN)
01400	BEGIN ASIN
01500		A←1 ↔ B←2
01600		PUSH 14,NUMVAL
01700		LACN A,ARG1↔FMPR A,ARG1↔FADRI A,(1.0)
01800		JUMPE A,[		;WAS X EITHER -1.0 OR 1.0?
01900			LAC A,HALFPI
02000			SKIPGE ARG1
02100			MOVNS A↔POP1J]
02200		PUSHJ 14,SQRT↔PUSHJ 14,NUMVAL
02300		LAC B,ARG1↔FDVR B,1↔DAC B,ARG1	;CALCULATE X/SQRT(1-X↑2)
02400		GO ATAN+1		;CALCULATE ATAN(SQRT(1-X↑2))
02500	BEND
02600	
     

00100	SUBR(LOG)
00200	BEGIN LOG
00300		PUSHJ 14,NUMVAL
00400		HRLI 2,(<MOVEI 2,>)↔CAME 2,MAKNUM+2↔FSC 1,233
00500		MOVM 2,ARG1↔SKIPE 1,2↔CAMN 2,[1.0]↔POP1J
00600		ASHC 2,-33↔DAC 3,1
00700		ADDI 2,211000↔MOVSM 2,TMP1#
00800		MOVSI 2,(-128.5)↔FADM 2,TMP1
00900		ASH 1,-10↔TLC 1,200000↔FAD 1,[-0.70710678]
01000		LAC 2,1↔FAD 2,[1.4142135]↔FDV 1,2
01100		DAC 1,TMP2#↔FMP 1,1
01200		LAC 2,[0.59897864]↔FMP 2,1
01300		FAD 2,[0.96147063]↔FMP 2,1
01400		FAD 2,[2.88539120]↔FMP 2,TMP2↔FAD 2,TMP1
01500		FMP 2,[0.69314718]↔LAC 1,2↔POP1J
01600		LIT↔VAR
01700	BEND
     

00100	SUBR(SQRT)
00200	BEGIN	SQRT
00300		A←1 ↔ B←2 ↔ C←3
00400		PUSHJ 14,NUMVAL
00500		HRLI 2,(<MOVEI 2,>)↔CAME 2,MAKNUM+2↔FSC 1,233
00600		LACM B,ARG1
00700		JUMPE B,POP1J.
00800	
00900	;LET X=F*(2↑2B) WHERE 0.25<F<1.00 THEN SQRT(X)=SQRT(F)*(2↑B).
01000		ASHC B,-=27↔SUBI B,201	;GET EXPONENT IN B, FRACTION IN C.
01100		ROT B,-1		;CUT EXP IN HALF, SAVE ODD BIT
01200		DAP B,L↔LSH B,-=35	;USE THAT ODD BIT.
01300		ASH C,-10↔FSC C,177(B)	;0.25 < FRACTION < 1.00
01400	
01500	;LINEAR APPROXIMATION TO SQRT(F).
01600		DAC C,A
01700		FMP C,[0.8125↔0.578125](B)
01800		FAD C,[0.302734↔0.421875](B)
01900	
02000	;TWO ITERATIONS OF NEWTON'S METHOD.
02100		LAC B,A
02200		FDV B,C↔FAD C,B↔FSC C,-1
02300		FDV A,C↔FADR A,C↔L: FSC A,0
02400	↑POP1J.: GO MAKNUM+2
02500		LIT
02600	BEND
     

00100	;ATAN(X) = X*(B0+A1 / (Z+B1-A2 / (Z+B2-A3 / (Z+B3))) )
00200	;WHERE Z=X↑2, IF 0<X<=1
00300	;IF X>1, THEN ATAN(X) = PI/2 - ATAN(1/X)
00400	;IF X>1, THEN RH(D) =-1, AND LH(D) = -SGN(X)
00500	;IF X<1, THEN RH(D) = 0, AND LH(D) =  SGN(X)
00600	SUBR(ATAN)
00700	BEGIN ATAN
00800		A←1 ↔ B←2 ↔ C←3 ↔ D←4 ↔ E←5 ↔ P←17
00900		PUSHJ 14,NUMVAL		;PICK UP THE ARGUMENT IN A
01000	ATAN1:	LACM	B, A		;GET ABSF OF ARGUMENT
01100		CAMG	B, A1		;IF X<2↑-33, THEN RETURN WITH...
01200		POP1J		;ATAN(X) = X
01300		HLLO	D, A		;SAVE SIGN, SET RH(D) = -1
01400		CAML	B, A2		;IF A>2↑33, THEN RETURN WITH
01500		GO[LAC A,HALFPI ↔POP1J];	ATAN(X) = PI/2
01600		MOVSI	C, 201400	;FORM 1.0 IN C
01700		CAMG	B, C		;IS ABSF(X)>1.0?
01800		TRZA	D, -1		;IF B ≤ 1.0, THEN RH(D) = 0
01900		FDVM	C, B		;B IS REPLACED BY 1.0/B
02000		TLC	D, (D)		;XOR SIGN WITH > 1.0 INDICATOR
02100	
02200		DAC B,E↔FMP B,B
02300		LAC C,B↔FAD C,KB3↔LAC A,KA3↔FDVM A,C
02400		FAD C,B↔FAD C,KB2↔LAC A,KA2↔FDVM A,C
02500		FAD C,B↔FAD C,KB1↔LAC A,KA1↔FDV  A,C
02600		FAD A,KB0↔FMP A,E
02700	
02800		TRNE	D, -1		;CHECK > 1.0 INDICATOR
02900		FSB	A, HALFPI		;ATAN(A) = -(ATAN(1/A)-PI/2)
03000		SKIPGE	D		;LH(D) = -SGN(B) IF B>1.0
03100		MOVNS A		;NEGATE ANSWER
03200		POP1J		;EXIT
03300	A1:	145000000000		;2↑-33
03400	A2:	233000000000		;2↑33
03500	
03600	KB0:	176545543401		;0.1746554388
03700	KB1:	203660615617		;6.762139240
03800	KB2:	202650373270		;3.316335425
03900	KB3:	201562663021		;1.448631538
04000	
04100	KA1:	202732621643		;3.709256262
04200	KA2:	574071125540		;-7.106760045
04300	KA3:	600360700773		;-0.2647686202
04400	BEND
04500	END
04600	LSPTRG.FAI - EOF.