--- a/ArithmeticValue.st Thu Nov 14 22:55:16 2002 +0100
+++ b/ArithmeticValue.st Fri Nov 15 13:16:19 2002 +0100
@@ -723,8 +723,20 @@
"Created: 17.4.1996 / 12:34:10 / cg"
! !
+
!ArithmeticValue methodsFor:'misc math'!
+** aNumber
+ "return the receiver raised to aNumber"
+
+ ^ self raisedTo:aNumber
+
+ "
+ 2 ** 4
+ 10 ** 4
+ "
+!
+
exp
"return e ^ receiver"
@@ -761,23 +773,90 @@
aNumber = 0 ifTrue:[^ 1].
aNumber = 1 ifTrue:[^ self].
aNumber isInteger ifTrue:[
- ^ self raisedToInteger:aNumber
+ ^ self raisedToInteger:aNumber
].
^ self asFloat raisedTo:aNumber
+
+ "
+ 2 raisedTo: 4
+ 10 raisedTo: 4
+ "
!
-raisedToInteger:anInteger
- "return the receiver raised to anInteger"
+raisedToInteger:exp
+ "return the receiver raised to exp"
+
+ |result e t
+ |
+
+ "use the addition chaining algorithm"
+
+ result := 1.
+ t := self.
+ exp < 0 ifTrue:[
+ e := exp negated.
+ ] ifFalse:[
+ e := exp.
+ ].
- |count result|
+ [e ~~ 0] whileTrue:[
+ [(e bitAnd:1) == 0] whileTrue:[
+ e := e bitShift:-1.
+ t := t * t.
+ ].
+ e := e - 1.
+ result := result * t.
+ ].
+
+ (exp < 0) ifTrue:[
+ ^ 1 / result
+ ].
+
+ ^ result
+
+
+ "
+ (2 raisedToInteger:216)
+ (2 raisedTo:216)
+-> 105312291668557186697918027683670432318895095400549111254310977536
- result := self coerce:1.
- count := anInteger abs.
- count timesRepeat:[result := result * self].
- (anInteger < 0) ifTrue:[
- ^ 1 / result
- ].
- ^ result
+ (2 raisedToInteger:216) asFloat
+ (2 raisedTo:216) asFloat
+-> 1.05312E+65
+
+ (2 raisedToInteger:500)
+ (2 raisedTo:500)
+-> 3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376
+ 2 raisedToInteger:10
+-> 1024
+ -2 raisedToInteger:10
+-> 1024
+ -2 raisedToInteger:9
+-> -512
+ 10 raisedToInteger:-10
+-> (1/10000000000)
+ 2 raisedToInteger:0
+-> 1
+ 2 raisedToInteger:-1
+-> (1/2)
+
+ Time millisecondsToRun:[
+ 10000 timesRepeat:[
+ (2 raisedToInteger:500)
+ ]
+ ]
+
+ Time millisecondsToRun:[
+ |bigNum|
+ bigNum := 2 raisedToInteger:500.
+ 10 timesRepeat:[
+ (bigNum raisedToInteger:500)
+ ]
+ ]
+ "
+
+ "Created: / 27.4.1999 / 15:19:22 / stefan"
+ "Modified: / 27.4.1999 / 16:16:11 / stefan"
!
sqrt
@@ -964,6 +1043,7 @@
!ArithmeticValue class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/ArithmeticValue.st,v 1.43 2002-07-31 14:38:58 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/ArithmeticValue.st,v 1.44 2002-11-15 12:16:19 cg Exp $'
! !
+
ArithmeticValue initialize!
--- a/Integer.st Thu Nov 14 22:55:16 2002 +0100
+++ b/Integer.st Fri Nov 15 13:16:19 2002 +0100
@@ -1797,6 +1797,8 @@
"Modified: 1.3.1997 / 16:45:17 / cg"
! !
+
+
!Integer methodsFor:'misc math'!
acker:n
@@ -2256,94 +2258,6 @@
"Modified: / 5.5.1999 / 11:01:15 / stefan"
!
-raisedToInteger:exp
- "return the receiver raised to exp"
-
- |result e t
-"/ bits "{SmallInteger}"
- |
-
- "use the addition chaining algorithm"
-
- result := 1.
- t := self.
- exp < 0 ifTrue:[
- e := exp negated.
- ] ifFalse:[
- e := exp.
- ].
-
- [e ~~ 0] whileTrue:[
- [(e bitAnd:1) == 0] whileTrue:[
- e := e bitShift:-1.
- t := t * t.
- ].
- e := e - 1.
- result := result * t.
- ].
-
-"/ the new algorithm above is somewhat faster (15%)
-"/
-"/ bits := e highBit.
-"/
-"/ 1 to:bits do:[:i|
-"/ (e bitAt:i) == 1 ifTrue:[
-"/ result := result * t.
-"/ ].
-"/ t := t * t.
-"/ ].
-
- (exp < 0) ifTrue:[
- ^ 1 / result
- ].
-
- ^ result
-
-
- "
- (2 raisedToInteger:216)
- (2 raisedTo:216)
--> 105312291668557186697918027683670432318895095400549111254310977536
-
- (2 raisedToInteger:216) asFloat
- (2 raisedTo:216) asFloat
--> 1.05312E+65
-
- (2 raisedToInteger:500)
- (2 raisedTo:500)
--> 3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376
- 2 raisedToInteger:10
--> 1024
- -2 raisedToInteger:10
--> 1024
- -2 raisedToInteger:9
--> -512
- 10 raisedToInteger:-10
--> (1/10000000000)
- 2 raisedToInteger:0
--> 1
- 2 raisedToInteger:-1
--> (1/2)
-
- Time millisecondsToRun:[
- 10000 timesRepeat:[
- (2 raisedToInteger:500)
- ]
- ]
-
- Time millisecondsToRun:[
- |bigNum|
- bigNum := 2 raisedToInteger:500.
- 10 timesRepeat:[
- (bigNum raisedToInteger:500)
- ]
- ]
- "
-
- "Created: / 27.4.1999 / 15:19:22 / stefan"
- "Modified: / 27.4.1999 / 16:16:11 / stefan"
-!
-
recursiveFib
"compute the fibionacci number for the receiver.
WARNING:
@@ -3194,6 +3108,7 @@
!Integer class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/Integer.st,v 1.151 2002-07-31 13:28:27 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/Integer.st,v 1.152 2002-11-15 12:15:28 cg Exp $'
! !
+
Integer initialize!