000
03.06.2017, 15:33 Uhr
_lars
|
Außer Pseudozufallszahlen kann man auch hin und wieder den Sinus (bzw. Kosinus) eines Winkels gut für irgendwelche Berechnungen brauchen. Ich habe also mal nach Sinus für Forth gesucht und das hier gefunden:
https://wiki.forth-ev.de/doku.php/words:sinus
und weil es so schön ist angepasst auf KC Forth portiert:
Quellcode: | 0000 VARIABLE sinuslookup 0349 , 0698 , 1045 , 1392 , 1736 , 2079 , 2419 , 2756 , 3090 , 3420 , 3746 , 4067 , 4384 , 4695 , 5000 , 5299 , 5592 , 5878 , 6157 , 6428 , 6691 , 6947 , 7193 , 7431 , 7660 , 7880 , 8090 , 8290 , 8480 , 8660 , 8829 , 8988 , 9135 , 9272 , 9397 , 9511 , 9613 , 9703 , 9781 , 9848 , 9903 , 9945 , 9976 , 9994 , 10000 ,
-1 CONSTANT TRUE 0 CONSTANT FALSE : NEGATE -1 * ; : SINUS@ 2 * sinuslookup + @ ; : SIN ( GRAD -- SINUS ) DUP 0< >R ABS 360 MOD DUP 180 > IF 180 - TRUE >R ELSE FALSE >R ENDIF DUP 90 > IF 180 SWAP - ENDIF 2 / SINUS@ R> IF NEGATE ENDIF R> IF NEGATE ENDIF ; : COS 90 + SIN ;
|
Diese Version hat aus Gründen der begrenzten Größe der Screens in KC Forth nur 45 Tabellenwerte (statt 90 wie im Original) und deshalb auch die unschöne Division durch zwei vor dem Lookup. Aber was soll’s, es funktioniert hinreichend gut.
Hier noch mal der Code zum direkten Einfügen (rechte Maustaste im JKCEMU) des Codes nach dem Starten von Forth:
Quellcode: | 1 SCR ! EDITOR 0 P 0000 VARIABLE sinuslookup 1 P 0349 , 0698 , 1045 , 2 P 1392 , 1736 , 2079 , 2419 , 3 P 2756 , 3090 , 3420 , 3746 , 4 P 4067 , 4384 , 4695 , 5000 , 5 P 5299 , 5592 , 5878 , 6157 , 6 P 6428 , 6691 , 6947 , 7193 , 7 P 7431 , 7660 , 7880 , 8090 , 8 P 8290 , 8480 , 8660 , 8829 , 9 P 8988 , 9135 , 9272 , 9397 , 10 P 9511 , 9613 , 9703 , 9781 , 11 P 9848 , 9903 , 9945 , 9976 , 12 P 9994 , 10000 , FORTH 1 LOAD
2 SCR ! EDITOR 0 P -1 CONSTANT TRUE 1 P 0 CONSTANT FALSE 2 P : NEGATE -1 * ; 3 P : SINUS@ 2 * sinuslookup + @ ; 4 P : SIN ( GRAD -- SINUS ) 5 P DUP 0< >R ABS 6 P 360 MOD 7 P DUP 180 > 8 P IF 180 - TRUE >R 9 P ELSE FALSE >R ENDIF 10 P DUP 90 > 11 P IF 180 SWAP - ENDIF 12 P 2 / SINUS@ 13 P R> IF NEGATE ENDIF 14 P R> IF NEGATE ENDIF ; 15 P : COS 90 + SIN ; FORTH 2 LOAD
3 SCR ! EDITOR 0 P : SINCURVE 1 P 12 EMIT 7 INKP 2 P 320 0 DO ?TERMINAL 3 P IF LEAVE ENDIF 4 P 1 I 5 P I 360 320 */ SIN 6 P 128 10000 */ 128 + 7 P PIX 8 P LOOP ; FORTH 3 LOAD
SINCURVE
|
|