# HG changeset patch # User Claus Gittinger # Date 1057138482 -7200 # Node ID 61c8a3053bf48f8450a69cb38d7e0274836b11f0 # Parent 8c4475cadbd0d3dc001170e066dc7210c7877617 moved math functions to number diff -r 8c4475cadbd0 -r 61c8a3053bf4 ArithmeticValue.st --- a/ArithmeticValue.st Tue Jul 01 21:44:05 2003 +0200 +++ b/ArithmeticValue.st Wed Jul 02 11:34:42 2003 +0200 @@ -965,98 +965,6 @@ " ! -raisedTo:aNumber - "return the receiver raised to aNumber" - - aNumber = 0 ifTrue:[^ 1]. - aNumber = 1 ifTrue:[^ self]. - aNumber isInteger ifTrue:[ - ^ self raisedToInteger:aNumber - ]. - ^ self asFloat raisedTo:aNumber - - " - 2 raisedTo: 4 - 10 raisedTo: 4 - " -! - -raisedToInteger:exp - "return the receiver raised to exp" - - |result e t| - - "use the addition chaining algorithm, - which is much faster for big exp-arguments" - - 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. - ]. - - (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" -! - squared "return receiver * receiver" @@ -1220,7 +1128,7 @@ !ArithmeticValue class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic/ArithmeticValue.st,v 1.58 2003-06-21 10:25:46 cg Exp $' + ^ '$Header: /cvs/stx/stx/libbasic/ArithmeticValue.st,v 1.59 2003-07-02 09:34:34 cg Exp $' ! ! ArithmeticValue initialize! diff -r 8c4475cadbd0 -r 61c8a3053bf4 Number.st --- a/Number.st Tue Jul 01 21:44:05 2003 +0200 +++ b/Number.st Wed Jul 02 11:34:42 2003 +0200 @@ -750,6 +750,98 @@ ^ self ln / aNumber ln ! +raisedTo:aNumber + "return the receiver raised to aNumber" + + aNumber = 0 ifTrue:[^ 1]. + aNumber = 1 ifTrue:[^ self]. + aNumber isInteger ifTrue:[ + ^ self raisedToInteger:aNumber + ]. + ^ self asFloat raisedTo:aNumber + + " + 2 raisedTo: 4 + 10 raisedTo: 4 + " +! + +raisedToInteger:exp + "return the receiver raised to exp" + + |result e t| + + "use the addition chaining algorithm, + which is much faster for big exp-arguments" + + 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. + ]. + + (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" +! + real "Return the real part of this Number." @@ -1613,5 +1705,5 @@ !Number class methodsFor:'documentation'! version - ^ '$Header: /cvs/stx/stx/libbasic/Number.st,v 1.86 2003-06-26 14:39:23 cg Exp $' + ^ '$Header: /cvs/stx/stx/libbasic/Number.st,v 1.87 2003-07-02 09:34:42 cg Exp $' ! !