tuned raisedToInteger:
authorClaus Gittinger <cg@exept.de>
Wed, 27 Oct 1999 00:09:05 +0200
changeset 4952 c5ab479d3e60
parent 4951 9943e85aa62a
child 4953 b021f07215b2
tuned raisedToInteger:
Integer.st
--- a/Integer.st	Tue Oct 26 23:47:50 1999 +0200
+++ b/Integer.st	Wed Oct 27 00:09:05 1999 +0200
@@ -1728,8 +1728,7 @@
 raisedToInteger:exp 
     "return the receiver raised to exp"
 
-    |result e t bits "{SmallInteger}"
-     eI "{SmallInteger}" |
+    |result e t bits "{SmallInteger}"|
 
     "use the addition chaining algorithm"
 
@@ -1741,25 +1740,24 @@
         e := exp.
     ].
 
-"/    (e class == SmallInteger) ifTrue:[
-"/        eI := e.
-"/        [eI ~~ 0] whileTrue:[
-"/            [(eI bitAnd:1) == 0] whileTrue:[
-"/                eI := eI bitShift:-1.
-"/                t := t * t.
-"/            ].
-"/            eI := eI - 1.
+    [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.
 "/        ].
-"/    ] ifFalse:[
-        bits := e highBit.
-
-        1 to:bits do:[:i|
-            (e bitAt:i) == 1 ifTrue:[
-                result := result * t.
-            ].
-            t := t * t.
-        ].
+"/        t := t * t.
 "/    ].
 
     (exp < 0) ifTrue:[
@@ -1770,30 +1768,35 @@
 
 
     "
+     (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 raisedTo:10
+     2 raisedToInteger:10 
 -> 1024
-    -2 raisedTo:10
+    -2 raisedToInteger:10
 -> 1024
-     -2 raisedTo:9
+     -2 raisedToInteger:9
 -> -512
-     10 raisedTo:-10
+     10 raisedToInteger:-10
 -> (1/10000000000)
-     2 raisedTo:0
+     2 raisedToInteger:0 
 -> 1
-     2 raisedTo:-1
+     2 raisedToInteger:-1 
 -> (1/2)
 
      Time millisecondsToRun:[
         10000 timesRepeat:[
             (2 raisedToInteger:500)
         ]
-     ] 
+     ]  
 
      Time millisecondsToRun:[
         |bigNum|
@@ -2482,5 +2485,5 @@
 !Integer class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Integer.st,v 1.117 1999-10-26 20:58:06 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Integer.st,v 1.118 1999-10-26 22:09:05 cg Exp $'
 ! !