Anzeigen des Gesamtinhalts (oder Logo links anklicken) oder des Impressums.

Unterschiede

Hier werden die Unterschiede zwischen zwei Versionen gezeigt.

Link zu dieser Vergleichsansicht

Beide Seiten der vorigen Revision Vorhergehende Überarbeitung
Nächste Überarbeitung
Vorhergehende Überarbeitung
forth:rechnervergleiche [2017-10-05 08:43]
rainer kein 16-bit
forth:rechnervergleiche [2017-10-05 17:53] (aktuell)
rainer 16 bit Version
Zeile 7: Zeile 7:
  
 <code forth collatz.fc>​ <code forth collatz.fc>​
-\ Benchmark mit der Collatz-Funktion+\ Benchmark mit der Collatz-Funktion ​ V1.1 RG 2017-10-05
 \   ​c[n+1] = if even(c[n]) then c[n]/2 else 3*c[n]+1 fi \   ​c[n+1] = if even(c[n]) then c[n]/2 else 3*c[n]+1 fi
 \ 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)/​2 = 3*q[n] + 2 \ (3*c[n]+1)/​2 = 3*q[n] + 2
 +\ Diese Version für 16-bit Rechner prüft vor einem Überlauf und bricht die Folge ab:
 +\ Damit 3*q+2<​32767 ist, muss q<10922 sein.
   
-\ 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+  ​if dup 10922 < ( ueberlauf ? ) 
 +    ​if 3 * 2 +  
 +    else drop 0 endif 
 +  ​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 
- 
  
 </​code>​ </​code>​
  
-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.sec.+auf einem Intel(R) Core(TM) i5-5300U CPU @ 2.30GHz unter Debian Linux mit gforth sind es 14.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>​32767,​ also q>10921 ist, wenn also die Ausgangzahl ungerade und größer als 21843 ist. Gerade Ausgangszahlen ergeben weniger als 16348, sind also immer möglich. Es reicht nicht, auf negative Resultate zu testen, weil durch die Multiplikation mit 3 positive Resultate entstehen können.
  

Anmelden