( Sine and cosine                            JCB 18:29 11/18/10)

create sintab

meta

: mksin
    65 0 do
        i s>d d>f 128e0 f/ pi f* fsin
        32767e0 f* f>d drop
        t,
    loop
;
mksin

target

: sin ( th -- v )
    dup d# 128 and >r
    d# 127 and
    dup d# 63 > if
        invert d# 129 + \ 64->64, 65->63
    then
    cells sintab + @
    r> if
        negate
    then
;

: cos d# 64 + sin ;

: sin* ( s th -- sinth * s )
    sin swap 2* m* nip ;

: cos* ( s th -- costh * s )
    cos swap 2* m* nip ;