raisedToInteger pushed up
authorClaus Gittinger <cg@exept.de>
Fri, 15 Nov 2002 13:16:19 +0100
changeset 6858 13919a7544b6
parent 6857 4540eeb3c958
child 6859 5ef85865e8db
raisedToInteger pushed up
ArithmeticValue.st
Integer.st
--- 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!