Unterschiede
Hier werden die Unterschiede zwischen zwei Versionen angezeigt.
| Beide Seiten der vorigen RevisionVorhergehende ÜberarbeitungNächste Überarbeitung | Vorhergehende Überarbeitung | ||
| forth:rechnervergleiche [2017-10-05 15:40] – Ergänzung Überlauf 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 27 sec, | + | 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 8.7 sec. | + | auf einem Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz unter Debian Linux mit gforth sind es 14.5 sec. |
| - | + | ||
| - | **Allerdings ist mit den angegebenen Ausgangswerten kein 16-Bit FORTH möglich, da die Folgenglieder größer als 32767 werden.** | + | |
| + | 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> | Dies ist immer dann der Fall, wenn 3q+2> | ||
