Prev: 3713 Up: Map Next: 37AA
3783: THE 'REDUCE ARGUMENT' SUBROUTINE (offset +39)
The address of this routine is found in the table of addresses. It is called via the calculator literal +39 by the routines at cos and sin.
This subroutine transforms the argument X of SIN X or COS X into a value V.
The subroutine first finds the value Y=X/2π-INT(X/2π+0.5), where -0.5<=Y<0.5.
The subroutine returns with:
  • V=4*Y if -1<=4*Y<=1 (case i)
  • or V=2-4*Y if 1<4*Y<2 (case ii)
  • or V=-4*Y-2 if -2<=4*Y<-1 (case iii)
In each case, -1<=V<=1 and SIN (πV/2)=SIN X.
Input
Output
get_argt 3783 RST $28 X
3784 DEFB $3D re_stack: X (in full floating-point form)
3785 DEFB $34 stk_data: X, 1/2π
3786 DEFB $EE,$22,$F9,$83,$6E
378B DEFB $04 multiply: X/2π
378C DEFB $31 duplicate: X/2π, X/2π
378D DEFB $A2 stk_half: X/2π, X/2π, 0.5
378E DEFB $0F addition: X/2π, X/2π+0.5
378F DEFB $27 int: X/2π, INT (X/2π+0.5)
3790 DEFB $03 subtract: X/2π-INT (X/2π+0.5)=Y
Note: adding 0.5 and taking INT rounds the result to the nearest integer.
3791 DEFB $31 duplicate: Y, Y
3792 DEFB $0F addition: 2*Y
3793 DEFB $31 duplicate: 2*Y, 2*Y
3794 DEFB $0F addition: 4*Y
3795 DEFB $31 duplicate: 4*Y, 4*Y
3796 DEFB $2A abs: 4*Y, ABS (4*Y)
3797 DEFB $A1 stk_one: 4*Y, ABS (4*Y), 1
3798 DEFB $03 subtract: 4*Y, ABS (4*Y)-1=Z
3799 DEFB $31 duplicate: 4*Y, Z, Z
379A DEFB $37 greater_0: 4*Y, Z, (1/0)
379B DEFB $C0 st_mem_0: (mem-0 holds the result of the test)
379C DEFB $00 jump_true to ZPLUS: 4*Y, Z
379D DEFB $04
379E DEFB $02 delete: 4*Y
379F DEFB $38 end_calc: 4*Y=V (case i)
37A0 RET Finished.
If the jump was made then continue.
ZPLUS 37A1 DEFB $A1 stk_one: 4*Y, Z, 1
37A2 DEFB $03 subtract: 4*Y, Z-1
37A3 DEFB $01 exchange: Z-1, 4*Y
37A4 DEFB $36 less_0: Z-1, (1/0)
37A5 DEFB $00 jump_true to YNEG: Z-1
37A6 DEFB $02
37A7 DEFB $1B negate: 1-Z
YNEG 37A8 DEFB $38 end_calc: 1-Z=V (case ii) or Z-1=V (case iii)
37A9 RET Finished.
Prev: 3713 Up: Map Next: 37AA