forth:rechnervergleiche
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Nächste Überarbeitung | Vorhergehende Überarbeitung | ||
forth:rechnervergleiche [2017-10-03 17:01] – created rainer | forth:rechnervergleiche [2017-10-05 19:53] (aktuell) – 16 bit Version rainer | ||
---|---|---|---|
Zeile 1: | Zeile 1: | ||
- | ====== xxx ====== | + | ===== Vergleichsprogramme (Benchmark) |
Zum Vergleich kleiner Rechner ist Forth gut geeignet, da der Implemetaionsaufwand gering ist. | Zum Vergleich kleiner Rechner ist Forth gut geeignet, da der Implemetaionsaufwand gering ist. | ||
Hierzu sind kleine Programme mit üblichem Sprachumfang sinnvoll, wie sie auf [[http:// | Hierzu sind kleine Programme mit üblichem Sprachumfang sinnvoll, wie sie auf [[http:// | ||
- | Ein weiterer Kandidat ist die Collatz-Folge. | + | Ein weiterer Kandidat ist die Collatz-Folge: |
+ | <code forth collatz.fc> | ||
+ | \ Benchmark mit der Collatz-Funktion | ||
+ | \ | ||
+ | \ Da der zweite Term immer gerade ist, wird | ||
+ | \ | ||
+ | \ Seien r[n] der Rest und q[n] der Quotient von c[n]/2, also c[n] = 2*q[n] + r[n], somit bei r[n] = 1: | ||
+ | \ (3*c[n]+1)/ | ||
+ | \ Diese Version für 16-bit Rechner prüft vor einem Überlauf und bricht die Folge ab: | ||
+ | \ Damit 3*q+2< | ||
+ | |||
+ | \ Collatz-Schritt. Null wenn Ueberlauf | ||
+ | : cn+1 ( cn -- cm ) | ||
+ | 2 /mod swap | ||
+ | if dup 10922 < ( ueberlauf ? ) | ||
+ | if 3 * 2 + | ||
+ | else drop 0 endif | ||
+ | endif | ||
+ | ; | ||
+ | |||
+ | \ Collatz-Folge drucken | ||
+ | : coll. ( cn -- ) | ||
+ | begin dup 1 > while | ||
+ | cn+1 dup . | ||
+ | repeat | ||
+ | drop ( always 1 ) | ||
+ | ; | ||
+ | |||
+ | \ Collatz-Folge zaehlen. Null wenn Überlauf | ||
+ | : ccnt ( cn -- cnt) | ||
+ | 0 swap ( cnt cn ) | ||
+ | begin dup 1 > while | ||
+ | cn+1 dup | ||
+ | if swap 1+ swap ( zaehlen ) | ||
+ | else drop 0 | ||
+ | endif | ||
+ | repeat | ||
+ | drop | ||
+ | ; | ||
+ | |||
+ | \ Maximum fuer alle Folgen bis k bestimmen | ||
+ | : cmax ( k -- max ) | ||
+ | 0 swap ( max k ) | ||
+ | begin dup 0> while | ||
+ | dup ccnt ( max k cnt ) | ||
+ | rot ( k cnt max ) | ||
+ | max ( k max ) | ||
+ | swap ( max k ) | ||
+ | 1 - ( max k-1 ) | ||
+ | repeat | ||
+ | drop | ||
+ | ; | ||
+ | |||
+ | 32101 cmax . | ||
+ | ." = 126 ! " | ||
+ | |||
+ | : bench | ||
+ | 99 0 do 32101 cmax drop loop | ||
+ | ; | ||
+ | </ | ||
+ | |||
+ | Auf einem Fairphone 2 (Qualcomm MSM8974PRO-AA) ist die Zeit mit gforth etwa 45 sec, | ||
+ | auf einem Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz unter Debian Linux mit gforth sind es 14.5 sec. | ||
+ | |||
+ | Mit den angegebenen Ausgangswerten können nicht alle Werte mit 16-Bit FORTH berechnet, da die Folgenglieder größer als 32767 werden. In diesem Fall bricht das obige Programm die Folge ab und zählt sie nicht. | ||
+ | Dies ist immer dann der Fall, wenn 3q+2> | ||
forth/rechnervergleiche.1507042883.txt.gz · Zuletzt geändert: 2017-10-03 17:01 von rainer