forth:rechnervergleiche
Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
forth:rechnervergleiche [2017-10-03 17:13] – rainer | forth:rechnervergleiche [2017-10-05 19:53] (aktuell) – 16 bit Version rainer | ||
---|---|---|---|
Zeile 7: | Zeile 7: | ||
<code forth collatz.fc> | <code forth collatz.fc> | ||
- | \ Benchmark mit der Collatz-Funktion | + | \ Benchmark mit der Collatz-Funktion |
\ | \ | ||
\ Da der zweite Term immer gerade ist, wird | \ Da der zweite Term immer gerade ist, wird | ||
Zeile 13: | Zeile 13: | ||
\ 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: | \ 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)/ | \ (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: | + | \ Collatz-Schritt. Null wenn Ueberlauf |
: cn+1 ( cn -- cm ) | : cn+1 ( cn -- cm ) | ||
2 /mod swap | 2 /mod swap | ||
- | if 3 * 2 + endif | + | |
+ | | ||
+ | else drop 0 endif | ||
+ | | ||
; | ; | ||
Zeile 28: | Zeile 33: | ||
; | ; | ||
- | \ Collatz-Folge zaehlen | + | \ Collatz-Folge zaehlen. Null wenn Überlauf |
: ccnt ( cn -- cnt) | : ccnt ( cn -- cnt) | ||
0 swap ( cnt cn ) | 0 swap ( cnt cn ) | ||
begin dup 1 > while | begin dup 1 > while | ||
- | cn+1 swap 1+ swap | + | cn+1 dup |
+ | if swap 1+ swap ( zaehlen ) | ||
+ | else drop 0 | ||
+ | endif | ||
repeat | repeat | ||
drop | drop | ||
Zeile 51: | Zeile 59: | ||
32101 cmax . | 32101 cmax . | ||
- | ." = 194 ! " | + | ." = 126 ! " |
: bench | : bench | ||
99 0 do 32101 cmax drop loop | 99 0 do 32101 cmax drop loop | ||
; | ; | ||
- | |||
- | bench | ||
+ | </ | ||
- | </ | + | 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. | ||
- | Auf einem Fairphone 2 (Qualcomm MSM8974PRO-AA) ist die Zeit mit gforth etwa 27 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. |
- | auf einem Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz unter Debian Linux mit gforth | + | Dies ist immer dann der Fall, wenn 3q+2>32767, also q>10921 ist, wenn also die Ausgangzahl ungerade und größer als 21843 ist. Gerade Ausgangszahlen ergeben weniger als 16348, |
forth/rechnervergleiche.1507043629.txt.gz · Zuletzt geändert: 2017-10-03 17:13 von rainer