GeometricSeries.st
changeset 5079 aa82caad8dbc
parent 5058 6f3b933cae66
--- a/GeometricSeries.st	Mon Aug 12 10:48:19 2019 +0200
+++ b/GeometricSeries.st	Mon Aug 12 11:30:00 2019 +0200
@@ -91,16 +91,56 @@
      (1 to:128 byFactor:2) at:1.
      (1 to:128 byFactor:2) at:2.
      (1 to:128 byFactor:2) at:3.
-     (1 to:128 byFactor:2) last.
+     (1 to:128 byFactor:2) last.  
+     (1 to:100 byFactor:2) last.  
 
      (16 to:1 byFactor:(1/2)) do:[:v | Transcript showCR:v]
      (16 to:1 byFactor:(1/2)) at:1.
      (16 to:1 byFactor:(1/2)) at:2.
      (16 to:1 byFactor:(1/2)) at:3.
      (16 to:1 byFactor:(1/2)) last.
+     (16 to:3 byFactor:(1/2)) last.    
     "
 
     "Created: / 22-07-2019 / 14:49:12 / Claus Gittinger"
+!
+
+first
+    ^ start
+
+    "
+     (1 to:100 byFactor:2) first    
+     (10 to:100 byFactor:3) first    
+     (100 to:10 byFactor:1/3) first    
+    "
+
+    "Created: / 31.10.2001 / 15:06:31 / cg"
+!
+
+last
+    |n last|
+
+    n := (stop/start) log:factor.
+    n := n truncated asInteger.
+    ^ start * (factor raisedToInteger:n).
+
+    "
+     (1 to:100 byFactor:2) last    
+     (1 to:100 byFactor:3) last     
+     (10 to:100 byFactor:3) last    
+     (100 to:10 byFactor:1/3) last    
+     (100 to:1 byFactor:1/2) last    
+
+     (1 to:100 byFactor:2.0) last    
+     (1 to:64.0 byFactor:2.0) last    
+     (1 to:100 byFactor:3.0) last     
+     (10 to:100.0 byFactor:3) last    
+     (100 to:10.0 byFactor:0.3) last    
+     (100 to:3 byFactor:1/2) last    
+     (100 to:3 byFactor:0.5) last    
+    "
+
+    "Created: / 31.10.2001 / 15:06:31 / cg"
 ! !
 
 !GeometricSeries methodsFor:'enumerating'!
@@ -126,19 +166,19 @@
             ]
         ]
     ] ifTrue:[
-        "/ the code below avoids rounding errors
+        "/ the code below tries to avoid rounding errors
         "/ to accumulate if floats are enumerated.
         iter := 1.
         factor < 1 ifTrue:[
             [stop <= aValue] whileTrue:[
                 aBlock value:aValue.
-                aValue := start + (factor raisedTo:iter).
+                aValue := start * (factor raisedTo:iter).
                 iter := iter + 1.
             ]
         ] ifFalse:[
             [stop >= aValue] whileTrue:[
                 aBlock value:aValue.
-                aValue := start + (factor raisedTo:iter).
+                aValue := start * (factor raisedTo:iter).
                 iter := iter + 1.
             ]
         ]
@@ -151,16 +191,6 @@
 
      (GeometricSeries from:1 to:128 byFactor:2) do:[:v | Transcript showCR:v]
     "
-!
-
-size
-    |cnt|
-
-    cnt := 0.
-    self do:[:each | cnt := cnt + 1].
-    ^ cnt
-
-    "Created: / 31.10.2001 / 15:06:31 / cg"
 ! !
 
 !GeometricSeries methodsFor:'printing & storing'!
@@ -205,6 +235,39 @@
 
 ! !
 
+!GeometricSeries methodsFor:'queries'!
+
+size
+    |n last|
+
+    n := (stop/start) log:factor.
+    n := n truncated asInteger.
+    last := start * (factor raisedToInteger:n).
+    ^ n + 1
+
+"/    cnt := 0.
+"/    self do:[:each | cnt := cnt + 1].
+"/    ^ cnt
+
+    "
+     (1 to:100 byFactor:2) size    
+     (1 to:100 byFactor:3) size     
+     (10 to:100 byFactor:3) size    
+     (100 to:10 byFactor:1/3) size    
+     (100 to:1 byFactor:1/2) size    
+
+     (1 to:100 byFactor:2.0) size    
+     (1 to:64.0 byFactor:2.0) size    
+     (1 to:100 byFactor:3.0) size     
+     (10 to:100.0 byFactor:3) size    
+     (100 to:10.0 byFactor:0.3) size    
+     (100 to:3 byFactor:1/2) size    
+     (100 to:3 byFactor:0.5) size    
+    "
+
+    "Created: / 31.10.2001 / 15:06:31 / cg"
+! !
+
 !GeometricSeries class methodsFor:'documentation'!
 
 version