Prev: 36AF Up: Map Next: 3713
36C4: THE 'EXPONENTIAL' FUNCTION (offset +26)
Used by the routine at to_power.
The address of this routine is found in the table of addresses. It is called indirectly via fp_calc_2.
This subroutine handles the function EXP X and is the first of four routines that use the series generator to produce Chebyshev polynomials.
The approximation to EXP X is found as follows:
• i. X is divided by LN 2 to give Y, so that 2**Y is now the required result.
• ii. The value N is found, such that N=INT Y.
• iii. The value W=Y-N is found; 0<=W<=1, as required for the series to converge.
• iv. The argument Z=2*W-1 is formed.
• v. The series generator is used to return 2**W.
• vi. Finally N is added to the exponent, giving 2**(N+W), which is 2**Y and therefore the required answer.
Input
Output
exp 36C4 RST \$28 X
Perform step i.
36C5 DEFB \$3D re_stack: X (in full floating-point form)
36C6 DEFB \$34 stk_data: X, 1/LN 2
36C7 DEFB \$F1,\$38,\$AA,\$3B,\$29
36CC DEFB \$04 multiply: X/LN 2=Y
Perform step ii.
36CD DEFB \$31 duplicate: Y, Y
36CE DEFB \$27 int: Y, INT Y=N
36CF DEFB \$C3 st_mem_3: Y, N (mem-3 holds N)
Perform step iii.
36D0 DEFB \$03 subtract: Y-N=W
Perform step iv.
36D1 DEFB \$31 duplicate: W, W
36D2 DEFB \$0F addition: 2*W
36D3 DEFB \$A1 stk_one: 2*W, 1
36D4 DEFB \$03 subtract: 2*W-1=Z
Perform step v, passing to the series generator the parameter '8' and the eight constants required.
36D5 DEFB \$88 series_08: Z
36D6 DEFB \$13,\$36
36D8 DEFB \$58,\$65,\$66
36DB DEFB \$9D,\$78,\$65,\$40
36DF DEFB \$A2,\$60,\$32,\$C9
36E3 DEFB \$E7,\$21,\$F7,\$AF,\$24
36E8 DEFB \$EB,\$2F,\$B0,\$B0,\$14
36ED DEFB \$EE,\$7E,\$BB,\$94,\$58
36F2 DEFB \$F1,\$3A,\$7E,\$F8,\$CF
At the end of the last loop the 'last value' is 2**W.
Perform step vi.
36F7 DEFB \$E3 get_mem_3: 2**W, N
36F8 DEFB \$38 end_calc
36F9 CALL FP_TO_A The absolute value of N mod 256 is put into the A register.
36FC JR NZ,N_NEGTV Jump forward if N was negative.
36FE JR C,REPORT_6_2 Error if ABS N>+FF.
3700 ADD A,(HL) Now add ABS N to the exponent.
3701 JR NC,RESULT_OK Jump unless e>+FF.
Report 6 - Number too big.
REPORT_6_2 3703 RST \$08 Call the error handling routine.
3704 DEFB \$05
N_NEGTV 3705 JR C,RSLT_ZERO The result is to be zero if N<-255.
3707 SUB (HL) Subtract ABS N from the exponent as N was negative.
3708 JR NC,RSLT_ZERO Zero result if e less than zero.
370A NEG Minus e is changed to e.
RESULT_OK 370C LD (HL),A The exponent, e, is entered.
370D RET Finished: 'last value' is EXP X.
RSLT_ZERO 370E RST \$28 Use the calculator to make the 'last value' zero.
370F DEFB \$02 delete (the stack is now empty)
3710 DEFB \$A0 stk_zero: 0
3711 DEFB \$38 end_calc
3712 RET Finished, with EXP X=0.
 Prev: 36AF Up: Map Next: 3713