[squeak-dev] The Trunk: Kernel-ul.1006.mcz
commits at source.squeak.org
commits at source.squeak.org
Sun Mar 20 00:00:54 UTC 2016
Levente Uzonyi uploaded a new version of Kernel to project The Trunk:
http://source.squeak.org/trunk/Kernel-ul.1006.mcz
==================== Summary ====================
Name: Kernel-ul.1006
Author: ul
Time: 19 March 2016, 1:28:42.41382 pm
UUID: 0883d257-21c1-4bac-bc57-a6cfc1b423e4
Ancestors: Kernel-eem.1005
- 10% faster SmallInteger >> #decimalDigitLength on 64-bit VM
- added a comment to SmallInteger >> #numberOfDigitsInBase:
- reformatted and tweaked Number >> #raisedToInteger:
=============== Diff against Kernel-eem.1005 ===============
Item was changed:
----- Method: Number>>raisedToInteger: (in category 'mathematical functions') -----
raisedToInteger: anInteger
-
"The 0 raisedToInteger: 0 is an special case. In some contexts must be 1 and in others must
be handled as an indeterminate form.
I take the first context because that's the way that was previously handled.
Maybe further discussion is required on this topic."
+ | bitProbe result |
- |bitProbe result|
-
anInteger negative ifTrue: [^(self raisedToInteger: anInteger negated) reciprocal].
bitProbe := 1 bitShift: anInteger highBit - 1.
+ result := self class one.
+ [
+ (anInteger bitAnd: bitProbe) > 0 ifTrue: [ result := result * self ].
+ (bitProbe := bitProbe bitShift: -1) > 0 ]
+ whileTrue: [ result := result * result ].
- result := self class one.
- [
- (anInteger bitAnd: bitProbe) = 0 ifFalse: [result := result * self].
- bitProbe := bitProbe bitShift: -1.
- bitProbe > 0 ]
- whileTrue: [result := result * result].
-
^result!
Item was changed:
----- Method: SmallInteger>>decimalDigitLength (in category 'printing') -----
decimalDigitLength
"Answer the number of digits printed out in base 10.
Note that this only works for positive SmallIntegers up to 64-bits."
+ self < 10000 ifTrue: [
+ self < 100 ifTrue: [
+ self < 10 ifTrue: [ ^1].
+ ^2 ].
+ self < 1000 ifTrue: [ ^3 ].
+ ^4 ].
+ self < 100000000 ifTrue: [
+ self < 1000000 ifTrue: [
+ self < 100000 ifTrue: [ ^5].
+ ^6 ].
+ self < 10000000 ifTrue: [ ^7 ].
+ ^8 ].
+ self < 1000000000000 ifTrue: [
+ self < 10000000000 ifTrue: [
+ self < 1000000000 ifTrue: [ ^9 ].
+ ^10 ].
+ self < 100000000000 ifTrue: [ ^11 ].
+ ^12 ].
+ self < 10000000000000000 ifTrue: [
+ self < 100000000000000 ifTrue: [
+ self < 10000000000000 ifTrue: [ ^13 ].
+ ^14 ].
+ self < 1000000000000000 ifTrue: [ ^15 ].
+ ^16 ].
+ self < 1000000000000000000 ifTrue: [
+ self < 100000000000000000 ifTrue: [ ^17 ].
+ ^18 ].
+ self < 10000000000000000000 ifTrue: [ ^19 ].
+ ^20!
- ^self < 10000
- ifTrue:
- [self < 100
- ifTrue:
- [self < 10 ifTrue: [1] ifFalse: [2]]
- ifFalse:
- [self < 1000 ifTrue: [3] ifFalse: [4]]]
- ifFalse:
- [self < 100000000
- ifTrue:
- [self < 1000000
- ifTrue: [self < 100000 ifTrue: [5] ifFalse: [6]]
- ifFalse: [self < 10000000 ifTrue: [7] ifFalse: [8]]]
- ifFalse:
- [self < 1000000000000
- ifTrue:
- [self < 10000000000
- ifTrue: [self < 1000000000 ifTrue: [9] ifFalse: [10]]
- ifFalse: [self < 100000000000 ifTrue: [11] ifFalse: [12]]]
- ifFalse:
- [self < 10000000000000000
- ifTrue:
- [self < 100000000000000
- ifTrue: [self < 10000000000000 ifTrue: [13] ifFalse: [14]]
- ifFalse: [self < 1000000000000000 ifTrue: [15] ifFalse: [16]]]
- ifFalse:
- [self < 1000000000000000000
- ifTrue: [self < 100000000000000000 ifTrue: [17] ifFalse: [18]]
- ifFalse: [self < 10000000000000000000 ifTrue: [19] ifFalse: [20]]]]]]!
Item was changed:
----- Method: SmallInteger>>numberOfDigitsInBase: (in category 'printing') -----
numberOfDigitsInBase: b
"Return how many digits are necessary to print this number in base b.
Mostly same as super but an optimized version for base 10 case"
b = 10 ifFalse: [^super numberOfDigitsInBase: b].
+ self < 0 ifTrue: [^self negated numberOfDigitsInBase: b]. "We can't use #decimalDigitLength here, because the receiver might be SmallInteger minVal."
- self < 0 ifTrue: [^self negated numberOfDigitsInBase: b].
^self decimalDigitLength!
More information about the Squeak-dev
mailing list
|