# Forth-eV Wiki

### Webseiten-Werkzeuge

words:amforth-sinus

# sin and cos

```\ Sinus and Cosinus
\ Use table calculating integer sin.
\ Get values scaled by 10K.

\ tested ok on amforth-1.5 on butterfly atmega169; build 24.09.08

decimal

create sintab  \ 0...90 Grad, Index in Grad
0000 ,  0175 ,  0349 ,  0523 ,  0698 ,  0872 ,
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 ,

: sinus@        sintab + i@ ;
: sin           ( grad -- sinus )
dup 0< >r abs
360 mod
dup 180 > if 180 - 1 >r else 0 >r then
dup  90 > if 180 swap - then
sinus@
r> if negate then
r> if negate then ;
: cos           90 + sin ;

( finis)

\ Notes:

\ In gforth it has to be   : sinus@  ( grad -- )  cell * sintab + @ ;
\ Since it is i@ instead of @ and i@ increments by 16 bytes each step in an atmega flash,
\ there is no need for cell adjustment in this amforth version of sin.

\ In the phrase
\ dup 180 > if 180 - 1 >r else 0 >r then
\ 1 and 0 act as flags; TRUE and FALSE do this in gforth.

\ mk```
words/amforth-sinus.txt · Zuletzt geändert: 2010-12-29 18:12 (Externe Bearbeitung)