ArithmeticValue.st
changeset 7468 61c8a3053bf4
parent 7440 d96bfc80e75e
child 7471 c5d4bd612d9f
equal deleted inserted replaced
7467:8c4475cadbd0 7468:61c8a3053bf4
   963      2 ** 4    
   963      2 ** 4    
   964      10 ** 4    
   964      10 ** 4    
   965     "
   965     "
   966 !
   966 !
   967 
   967 
   968 raisedTo:aNumber
       
   969     "return the receiver raised to aNumber"
       
   970 
       
   971     aNumber = 0 ifTrue:[^ 1].
       
   972     aNumber = 1 ifTrue:[^ self].
       
   973     aNumber isInteger ifTrue:[
       
   974         ^ self raisedToInteger:aNumber
       
   975     ].
       
   976     ^ self asFloat raisedTo:aNumber
       
   977 
       
   978     "
       
   979      2 raisedTo: 4    
       
   980      10 raisedTo: 4    
       
   981     "
       
   982 !
       
   983 
       
   984 raisedToInteger:exp 
       
   985     "return the receiver raised to exp"
       
   986 
       
   987     |result e t|
       
   988 
       
   989     "use the addition chaining algorithm,
       
   990      which is much faster for big exp-arguments"
       
   991 
       
   992     result := 1.
       
   993     t := self.
       
   994     exp < 0 ifTrue:[
       
   995         e := exp negated.
       
   996     ] ifFalse:[
       
   997         e := exp.
       
   998     ].
       
   999 
       
  1000     [e ~~ 0] whileTrue:[
       
  1001         [(e bitAnd:1) == 0] whileTrue:[
       
  1002             e := e bitShift:-1.
       
  1003             t := t * t.
       
  1004         ].
       
  1005         e := e - 1.
       
  1006         result := result * t.
       
  1007     ].
       
  1008 
       
  1009     (exp < 0) ifTrue:[
       
  1010         ^ 1 / result
       
  1011     ].
       
  1012 
       
  1013     ^ result
       
  1014 
       
  1015 
       
  1016     "
       
  1017      (2 raisedToInteger:216)
       
  1018      (2 raisedTo:216) 
       
  1019 -> 105312291668557186697918027683670432318895095400549111254310977536     
       
  1020 
       
  1021      (2 raisedToInteger:216) asFloat     
       
  1022      (2 raisedTo:216) asFloat     
       
  1023 -> 1.05312E+65
       
  1024 
       
  1025      (2 raisedToInteger:500)
       
  1026      (2 raisedTo:500) 
       
  1027 -> 3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376
       
  1028      2 raisedToInteger:10 
       
  1029 -> 1024
       
  1030     -2 raisedToInteger:10
       
  1031 -> 1024
       
  1032      -2 raisedToInteger:9
       
  1033 -> -512
       
  1034      10 raisedToInteger:-10
       
  1035 -> (1/10000000000)
       
  1036      2 raisedToInteger:0 
       
  1037 -> 1
       
  1038      2 raisedToInteger:-1 
       
  1039 -> (1/2)
       
  1040 
       
  1041      Time millisecondsToRun:[
       
  1042         10000 timesRepeat:[
       
  1043             (2 raisedToInteger:500)
       
  1044         ]
       
  1045      ]  
       
  1046 
       
  1047      Time millisecondsToRun:[
       
  1048         |bigNum|
       
  1049         bigNum := 2 raisedToInteger:500.
       
  1050         10 timesRepeat:[
       
  1051             (bigNum raisedToInteger:500)
       
  1052         ]
       
  1053      ]
       
  1054     "
       
  1055 
       
  1056     "Created: / 27.4.1999 / 15:19:22 / stefan"
       
  1057     "Modified: / 27.4.1999 / 16:16:11 / stefan"
       
  1058 !
       
  1059 
       
  1060 squared
   968 squared
  1061     "return receiver * receiver"
   969     "return receiver * receiver"
  1062 
   970 
  1063     ^ self * self
   971     ^ self * self
  1064 ! !
   972 ! !
  1218 ! !
  1126 ! !
  1219 
  1127 
  1220 !ArithmeticValue class methodsFor:'documentation'!
  1128 !ArithmeticValue class methodsFor:'documentation'!
  1221 
  1129 
  1222 version
  1130 version
  1223     ^ '$Header: /cvs/stx/stx/libbasic/ArithmeticValue.st,v 1.58 2003-06-21 10:25:46 cg Exp $'
  1131     ^ '$Header: /cvs/stx/stx/libbasic/ArithmeticValue.st,v 1.59 2003-07-02 09:34:34 cg Exp $'
  1224 ! !
  1132 ! !
  1225 
  1133 
  1226 ArithmeticValue initialize!
  1134 ArithmeticValue initialize!