GeometricSeries.st
author Claus Gittinger <cg@exept.de>
Sat, 02 May 2020 21:40:13 +0200
changeset 5476 7355a4b11cb6
parent 5079 aa82caad8dbc
permissions -rw-r--r--
#FEATURE by cg class: Socket class added: #newTCPclientToHost:port:domain:domainOrder:withTimeout: changed: #newTCPclientToHost:port:domain:withTimeout:
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
5058
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
     1
"{ Encoding: utf8 }"
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
     2
3737
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     3
"
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     4
 COPYRIGHT (c) 2000 by eXept Software AG
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     5
              All Rights Reserved
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     6
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     7
 This software is furnished under a license and may be used
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     8
 only in accordance with the terms of that license and with the
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
     9
 inclusion of the above copyright notice.   This software may not
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    10
 be provided or otherwise made available to, or used by, any
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    11
 other person.  No title to or ownership of the software is
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    12
 hereby transferred.
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    13
"
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    14
"{ Package: 'stx:libbasic2' }"
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    15
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    16
"{ NameSpace: Smalltalk }"
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    17
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    18
ReadOnlySequenceableCollection subclass:#GeometricSeries
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    19
	instanceVariableNames:'start stop factor'
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    20
	classVariableNames:''
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    21
	poolDictionaries:''
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    22
	category:'Collections-Sequenceable'
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    23
!
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    24
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    25
!GeometricSeries class methodsFor:'documentation'!
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    26
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    27
copyright
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    28
"
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    29
 COPYRIGHT (c) 2000 by eXept Software AG
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    30
              All Rights Reserved
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    31
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    32
 This software is furnished under a license and may be used
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    33
 only in accordance with the terms of that license and with the
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    34
 inclusion of the above copyright notice.   This software may not
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    35
 be provided or otherwise made available to, or used by, any
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    36
 other person.  No title to or ownership of the software is
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    37
 hereby transferred.
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    38
"
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    39
!
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    40
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    41
documentation
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    42
"
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    43
    Much like intervals (which have a constant difference between elements), 
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    44
    these have a constant factor between them.
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    45
    GeometricSeries represent a collection (or range) of values specified by
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    46
    a startValue, an endValue and a *factor*. 
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    47
    Like with intervals, the elements are computed, not stored.
4453
e3e421183576 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3739
diff changeset
    48
    For example, 
e3e421183576 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3739
diff changeset
    49
        the GeometricSeries (1 to:100 byFactor:2) contains the elements (1 2 4 8 16 32 64).
e3e421183576 #DOCUMENTATION by cg
Claus Gittinger <cg@exept.de>
parents: 3739
diff changeset
    50
        and GeometricSeries (1 to:(1/100) byFactor:(1/2)) contains the elements (1 1/2 1/4 1/8 1/16 1/32 1/64).
3737
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    51
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    52
    examples:
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    53
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    54
        (1 to:100 byFactor:2) do:[:i | Transcript showCR:i]
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    55
        (1 to:100 byFactor:1.1) do:[:i | Transcript showCR:i]
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    56
        (1 to:100 byFactor:2) asArray  
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    57
        (1 to:128 byFactor:2) asArray  
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    58
        (128 to:2 byFactor:(1/2)) asArray  
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    59
3739
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
    60
        (1 to:128 byFactor:2) sum
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
    61
        (1 to:128 byFactor:2) asArray sum    
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
    62
        
3737
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    63
    [author:]
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    64
        Claus Gittinger
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    65
"
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    66
! !
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    67
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    68
!GeometricSeries class methodsFor:'instance creation'!
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    69
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    70
from:start to:stop byFactor:factor
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    71
    "return a new geometric series with elements from start
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    72
     to stop by a factor"
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    73
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    74
    ^ self new setFrom:start to:stop byFactor:factor
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    75
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    76
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    77
! !
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
    78
5058
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    79
!GeometricSeries methodsFor:'accessing'!
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    80
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    81
at:index
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    82
    "return (i.e. compute) the index'th element"
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    83
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    84
    (index between:1 and:self size) ifTrue:[
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    85
        ^ start * (factor raisedToInteger: (index - 1))
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    86
    ].
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    87
    ^ self subscriptBoundsError:index
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    88
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    89
    "
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    90
     (1 to:128 byFactor:2) do:[:v | Transcript showCR:v]
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    91
     (1 to:128 byFactor:2) at:1.
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    92
     (1 to:128 byFactor:2) at:2.
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    93
     (1 to:128 byFactor:2) at:3.
5079
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
    94
     (1 to:128 byFactor:2) last.  
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
    95
     (1 to:100 byFactor:2) last.  
5058
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    96
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    97
     (16 to:1 byFactor:(1/2)) do:[:v | Transcript showCR:v]
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    98
     (16 to:1 byFactor:(1/2)) at:1.
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
    99
     (16 to:1 byFactor:(1/2)) at:2.
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
   100
     (16 to:1 byFactor:(1/2)) at:3.
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
   101
     (16 to:1 byFactor:(1/2)) last.
5079
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   102
     (16 to:3 byFactor:(1/2)) last.    
5058
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
   103
    "
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
   104
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
   105
    "Created: / 22-07-2019 / 14:49:12 / Claus Gittinger"
5079
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   106
!
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   107
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   108
first
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   109
    ^ start
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   110
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   111
    "
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   112
     (1 to:100 byFactor:2) first    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   113
     (10 to:100 byFactor:3) first    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   114
     (100 to:10 byFactor:1/3) first    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   115
    "
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   116
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   117
    "Created: / 31.10.2001 / 15:06:31 / cg"
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   118
!
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   119
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   120
last
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   121
    |n last|
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   122
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   123
    n := (stop/start) log:factor.
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   124
    n := n truncated asInteger.
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   125
    ^ start * (factor raisedToInteger:n).
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   126
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   127
    "
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   128
     (1 to:100 byFactor:2) last    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   129
     (1 to:100 byFactor:3) last     
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   130
     (10 to:100 byFactor:3) last    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   131
     (100 to:10 byFactor:1/3) last    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   132
     (100 to:1 byFactor:1/2) last    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   133
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   134
     (1 to:100 byFactor:2.0) last    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   135
     (1 to:64.0 byFactor:2.0) last    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   136
     (1 to:100 byFactor:3.0) last     
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   137
     (10 to:100.0 byFactor:3) last    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   138
     (100 to:10.0 byFactor:0.3) last    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   139
     (100 to:3 byFactor:1/2) last    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   140
     (100 to:3 byFactor:0.5) last    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   141
    "
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   142
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   143
    "Created: / 31.10.2001 / 15:06:31 / cg"
5058
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
   144
! !
6f3b933cae66 #TUNING by cg
Claus Gittinger <cg@exept.de>
parents: 4453
diff changeset
   145
3737
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   146
!GeometricSeries methodsFor:'enumerating'!
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   147
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   148
do:aBlock
3739
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   149
    "evaluate the argument, aBlock for every element in the receiver. 
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   150
     Redefined since SeqColl accesses the receiver with at:, 
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   151
     which is slow for intervals."
3737
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   152
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   153
    |aValue iter|
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   154
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   155
    aValue := start.
3739
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   156
    (aValue isLimitedPrecisionReal or:[factor isLimitedPrecisionReal]) ifFalse:[
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   157
        factor < 1 ifTrue:[
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   158
            [stop <= aValue] whileTrue:[
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   159
                aBlock value:aValue.
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   160
                aValue := aValue * factor
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   161
            ]
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   162
        ] ifFalse:[
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   163
            [stop >= aValue] whileTrue:[
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   164
                aBlock value:aValue.
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   165
                aValue := aValue * factor
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   166
            ]
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   167
        ]
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   168
    ] ifTrue:[
5079
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   169
        "/ the code below tries to avoid rounding errors
3739
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   170
        "/ to accumulate if floats are enumerated.
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   171
        iter := 1.
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   172
        factor < 1 ifTrue:[
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   173
            [stop <= aValue] whileTrue:[
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   174
                aBlock value:aValue.
5079
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   175
                aValue := start * (factor raisedTo:iter).
3739
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   176
                iter := iter + 1.
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   177
            ]
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   178
        ] ifFalse:[
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   179
            [stop >= aValue] whileTrue:[
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   180
                aBlock value:aValue.
5079
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   181
                aValue := start * (factor raisedTo:iter).
3739
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   182
                iter := iter + 1.
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   183
            ]
89ee5376197c #REFACTORING
Claus Gittinger <cg@exept.de>
parents: 3737
diff changeset
   184
        ]
3737
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   185
    ]
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   186
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   187
    "
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   188
     (1 to:128 byFactor:2) do:[:v | Transcript showCR:v]
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   189
     (16 to:1 byFactor:(1/2)) do:[:v | Transcript showCR:v]
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   190
     (1.0 to:128.0 byFactor:2) do:[:v | Transcript showCR:v]
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   191
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   192
     (GeometricSeries from:1 to:128 byFactor:2) do:[:v | Transcript showCR:v]
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   193
    "
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   194
! !
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   195
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   196
!GeometricSeries methodsFor:'printing & storing'!
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   197
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   198
printOn:aStream
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   199
    "append a printed representation to aStream"
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   200
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   201
    start printOn:aStream.
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   202
    aStream nextPutAll:' to:'.
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   203
    stop printOn:aStream.
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   204
    aStream nextPutAll:' byFactor:'.
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   205
    factor printOn:aStream.
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   206
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   207
!
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   208
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   209
storeOn:aStream
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   210
    "store a representation which can reconstruct the receiver to aStream"
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   211
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   212
    aStream nextPut:$(.
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   213
    self printOn:aStream.
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   214
    aStream nextPut:$).
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   215
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   216
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   217
! !
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   218
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   219
!GeometricSeries methodsFor:'private'!
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   220
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   221
setFrom:startVal to:stopVal byFactor:factorVal
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   222
    "set start, stop and factor components"
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   223
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   224
    start := startVal.
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   225
    stop := stopVal.
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   226
    factor := factorVal
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   227
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   228
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   229
!
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   230
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   231
species
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   232
    "return the type of collection to be returned by collect, select etc."
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   233
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   234
    ^ OrderedCollection
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   235
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   236
! !
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   237
5079
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   238
!GeometricSeries methodsFor:'queries'!
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   239
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   240
size
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   241
    |n last|
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   242
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   243
    n := (stop/start) log:factor.
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   244
    n := n truncated asInteger.
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   245
    last := start * (factor raisedToInteger:n).
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   246
    ^ n + 1
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   247
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   248
"/    cnt := 0.
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   249
"/    self do:[:each | cnt := cnt + 1].
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   250
"/    ^ cnt
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   251
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   252
    "
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   253
     (1 to:100 byFactor:2) size    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   254
     (1 to:100 byFactor:3) size     
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   255
     (10 to:100 byFactor:3) size    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   256
     (100 to:10 byFactor:1/3) size    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   257
     (100 to:1 byFactor:1/2) size    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   258
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   259
     (1 to:100 byFactor:2.0) size    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   260
     (1 to:64.0 byFactor:2.0) size    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   261
     (1 to:100 byFactor:3.0) size     
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   262
     (10 to:100.0 byFactor:3) size    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   263
     (100 to:10.0 byFactor:0.3) size    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   264
     (100 to:3 byFactor:1/2) size    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   265
     (100 to:3 byFactor:0.5) size    
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   266
    "
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   267
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   268
    "Created: / 31.10.2001 / 15:06:31 / cg"
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   269
! !
aa82caad8dbc #BUGFIX by exept
Claus Gittinger <cg@exept.de>
parents: 5058
diff changeset
   270
3737
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   271
!GeometricSeries class methodsFor:'documentation'!
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   272
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   273
version
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   274
    ^ '$Header$'
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   275
!
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   276
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   277
version_CVS
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   278
    ^ '$Header$'
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   279
! !
0a9b58aeacf4 initial checkin
Claus Gittinger <cg@exept.de>
parents:
diff changeset
   280