Menu

SIN and COS lookup table Log in to Edit

Mikael Nordman

Here is a set of words to generate sin and cos values from a sin look-up table based on angles in degrees. The table values can be placed in ram, eeprom or flash. Flash seems to make the most sense if the table values will not be changed.

Written by Pete Zawasky

-sin_cos
marker -sin_cos
decimal ram

\ Print to four decimal places.
\
: .xxxx      ( n -- )
   dup >r abs 0 <# # # # # [char] . hold #s r> sign #> type space  ;  

\ 16/16->16 bit division. n3=remainder.
\
: mod ( n1 n2 -- n3 )
   >r s>d r> 
   2dup xor >r
   over >r
   abs >r dabs r> um/mod
   swap r> ?negate
   swap r> ?negate
   drop  ;  

\ Compile a word which creates n cell look-up tables.
\ compile-time         table <name>  n1 , n2 , ... ni ,
\ run-time           i <name> where i is the table index
\                               and i is zero based (0...i)
: table  ( -- )
   create 
   does>  ( i -- n ) swap cells + @  ;

\ 
\ SIN look-up table
\  0 --> 90 degrees

flash         \ set dataspace to flash
table tSIN
   0 ,  175 ,  349 ,  523 ,
 698 ,  872 , 1045 , 1219 ,
1392 , 1564 , 1736 , 1908 ,
2079 , 2250 , 2419 , 2588 ,
2756 , 2924 , 3090 , 3256 ,
3420 , 3584 , 3746 , 3907 ,
4067 , 4226 , 4384 , 4540 ,
4695 , 4848 , 5000 , 5150 ,
5299 , 5446 , 5592 , 5736 ,
5878 , 6018 , 6157 , 6293 ,
6428 , 6561 , 6691 , 6820 ,
6947 , 7071 , 7193 , 7314 ,
7431 , 7547 , 7660 , 7771 ,
7880 , 7986 , 8090 , 8192 ,
8290 , 8387 , 8480 , 8572 ,
8660 , 8746 , 8829 , 8910 ,
8988 , 9063 , 9135 , 9205 ,
9272 , 9336 , 9397 , 9455 ,
9511 , 9563 , 9613 , 9659 ,
9703 , 9744 , 9781 , 9816 ,
9848 , 9877 , 9903 , 9925 ,
9945 , 9962 , 9976 , 9986 ,
9994 , 9998 , 10000 ,

\  set dataspace back to ram
ram

: (sin)  ( deg -- sin )
   dup 90 > 
   if
     180 swap -
   then  tSIN  ;

: sin    ( deg -- sin )
   360 mod dup 0 <
   if
     360 +
   then
   dup 180 >
   if
     180 - (sin) negate
   else
     (sin)
   then  ;

: cos    ( deg -- cos )
   360 mod 90 + sin ;

\ Print the sin of angle.  
: .sin   ( deg -- )
   sin .xxxx  ;

\ Print the sin of angle.  
: .cos   ( deg -- )
   cos .xxxx  ;

\ Print sin 0-->359 degree.
: .sin360  ( -- )
   cr 0 #360 for dup .sin cr 1+ next  drop  ;

\ From the sin and cos you can easily write expressions for the other 
\ *direct* trig functions:
\
\  tan(x) = sin(x)/cos(x)
\  cot(x) = cos(x)/sin(x)
\  sec(x) = 1/cos(x)
\  csc(x) = 1/sin(x)

ram  hex

Related

Wiki: Home

Want the latest updates on software, tech news, and AI?
Get latest updates about software, tech news, and AI from SourceForge directly in your inbox once a month.