Routines
 Prev: 37DA Up: Map Next: 3833
37E2: THE 'ARCTAN' FUNCTION (offset +24)
The address of this routine is found in the table of addresses. It is called via the calculator literal +24 by the routine at asn. It is also called indirectly via fp_calc_2.
This subroutine handles the function ATN X and is the last of the four routines that use the series generator to produce Chebyshev polynomials. It returns a real number between -π/2 and π/2, which is equal to the value in radians of the angle whose tan is X.
The approximation to ATN X is found as follows:
i. The values W and Y are found for three cases of X, such that:
• if -1<X<1 then W=0, Y=X (case i)
• if 1<=X then W=π/2, Y=-1/X (case ii)
• if X<=-1 then W=-π/2, Y=-1/X (case iii)
In each case, -1<=Y<=1, as required for the series to converge.
ii. The argument Z is formed, such that:
• if -1<X<1 then Z=2*Y*Y-1=2*X*X-1 (case i)
• otherwise Z=2*Y*Y-1=2/(X*X)-1 (cases ii and iii)
iii. The series generator is used to produce the required function.
iv. Finally a simple multiplication and addition give ATN X.
Input
HL Address of the first byte of the number (X)
Perform step i.
atn 37E2 CALL re_stack Use the full floating-point form of X.
37E5 LD A,(HL) Fetch the exponent of X.
37E6 CP \$81 Jump forward for case i: Y=X.
37E8 JR C,SMALL
37EA RST \$28 X
37EB DEFB \$A1 stk_one: X, 1
37EC DEFB \$1B negate: X, -1
37ED DEFB \$01 exchange: -1, X
37EE DEFB \$05 division: -1/X
37EF DEFB \$31 duplicate: -1/X, -1/X
37F0 DEFB \$36 less_0: -1/X, (1/0)
37F1 DEFB \$A3 stk_pi_2: -1/X, (1/0), π/2
37F2 DEFB \$01 exchange: -1/X, π/2, (1/0)
37F3 DEFB \$00 jump_true to CASES for case ii: -1/X, π/2
37F4 DEFB \$06
37F5 DEFB \$1B negate: -1/X, -π/2
37F7 DEFB \$03
SMALL 37F8 RST \$28
37F9 DEFB \$A0 stk_zero: Y, 0; continue for case i: W=0
Perform step ii.
CASES 37FA DEFB \$01 exchange: W, Y
37FB DEFB \$31 duplicate: W, Y, Y
37FC DEFB \$31 duplicate: W, Y, Y, Y
37FD DEFB \$04 multiply: W, Y, Y*Y
37FE DEFB \$31 duplicate: W, Y, Y*Y, Y*Y
37FF DEFB \$0F addition: W, Y, 2*Y*Y
3800 DEFB \$A1 stk_one: W, Y, 2*Y*Y, 1
3801 DEFB \$03 subtract: W, Y, 2*Y*Y-1=Z
Perform step iii, passing to the series generator the parameter '12', and the twelve constants required.
3802 DEFB \$8C series_0C: W, Y, Z
3803 DEFB \$10,\$B2
3805 DEFB \$13,\$0E
3807 DEFB \$55,\$E4,\$8D
380A DEFB \$58,\$39,\$BC
380D DEFB \$5B,\$98,\$FD
3810 DEFB \$9E,\$00,\$36,\$75
3814 DEFB \$A0,\$DB,\$E8,\$B4
3818 DEFB \$63,\$42,\$C4
381B DEFB \$E6,\$B5,\$09,\$36,\$BE
3820 DEFB \$E9,\$36,\$73,\$1B,\$5D
3825 DEFB \$EC,\$D8,\$DE,\$63,\$BE
382A DEFB \$F0,\$61,\$A1,\$B3,\$0C
At the end of the last loop the 'last value' is:
• ATN X/X (case i)
• ATN (-1/X)/(-1/X) (cases ii and iii)
Perform step iv.
382F DEFB \$04 multiply: W, ATN X (case i) or W, ATN (-1/X) (cases ii and iii)
3830 DEFB \$0F addition: ATN X (all cases now)
3831 DEFB \$38 end_calc
3832 RET Finished: 'last value'=ATN X.
 Prev: 37DA Up: Map Next: 3833