home *** CD-ROM | disk | FTP | other *** search
- ANEW TASK-ARCSIN
-
- OB.ARRAY SIN-TABLE
- VARIABLE FP
-
- \ change df1: later with assign
-
- : LOADTABLE
- " 4th:FFT/SINETABLE" $FOPEN DUP IF FP !
- ELSE ABORT" SINETABLE NOT FOUND!" THEN
- 1000 NEW: SIN-TABLE
- FP @ DATA.ADDR: SIN-TABLE 4000 FREAD FP @ FCLOSE
- DUP 0> IF CR . ." BYTES READ TO SINE TABLE" CR
- ELSE FREE: SIN-TABLE ABORT" SINE TABLE WENT WRONG!!!" THEN
- ;
-
-
-
- \ BSEARCH FOR ARCSIN
- \ B stands for Brute force
- \ binary search on sin-table values
- : ARCSINSEARCH ( SIN -- INDEX)
- >R 0 999 ( -- lo hi)
- BEGIN
- 2DUP + 2/ ( -- low hi ave)
- DUP AT: SIN-TABLE ( -- low hi ave sinval)
- R@ 2DUP ( -- low hi ave sinval sin sinval sin )
- = IF RDROP DROP DROP NIP NIP EXIT ELSE ( -- index | low hi ave sinval sin)
- U> IF NIP ( -- low newhi)
- ELSE -ROT NIP ( -- newlow hi)
- THEN
- THEN
- 2DUP SWAP - 1 =
- UNTIL ( -- lo hi, stop when differ by 1)
- 2DUP AT: SIN-TABLE R@ - ( -- lo hi lo hisin-sin)
- SWAP AT: SIN-TABLE R> SWAP - ( -- lo hi hi-sin sin-lo)
- > IF DROP ELSE NIP THEN
- ;
-
- \ DEGREES
- : ARCSIN ( sin -- degrees)
- DUP 0< IF NEGATE ARCSINSEARCH NEGATE ELSE ARCSINSEARCH THEN
- 9000 1000 */
- ;
-
- : ARCSIN.INDEX ( sin -- signed index)
- DUP 0< IF NEGATE ARCSINSEARCH NEGATE ELSE ARCSINSEARCH THEN
- ;
-
- : SIN.LOOKUP ( index -- degrees*10000)
- DUP ABS 1000 >= IF ABORT" INDEX TO SINE TABLE TOO BIG!" CR THEN
- DUP 0< IF NEGATE AT: SIN-TABLE NEGATE ELSE AT: SIN-TABLE THEN ;
-
- \ The following is only used in fft, where we have an index to the
- \ table gotten from ARCSIN.INDEX. We need the sine AND cosine.
- \ cos(a) = sin(a+90)
- : COS.LOOKUP ( sinindex -- degrees*10000)
- DUP 0< IF 1000 + SIN.LOOKUP ELSE
- DUP 0= IF DROP 10000 ELSE
- 1000 SWAP - SIN.LOOKUP
- THEN THEN
- ;
-
-