A new version of Kernel was added to project The Inbox:
http://source.squeak.org/inbox/Kernel-ul.867.mcz ==================== Summary ==================== Name: Kernel-ul.867 Author: ul Time: 8 August 2014, 2:38:42.181 pm UUID: 063b12b2-4b02-4c50-a8a9-65e1e733adff Ancestors: Kernel-eem.866 - support code for Fraction literals - optimized versions of #isZero. =============== Diff against Kernel-eem.866 =============== Item was added: + ----- Method: Fraction>>isLiteral (in category 'printing') ----- + isLiteral + + | remainder powerOfFive expPowersOfFive qr index | + (remainder := denominator bitShift: 1 - denominator lowBit) = 1 ifTrue: [ ^true ]. + powerOfFive := 5. + expPowersOfFive := OrderedCollection new. + [ + qr := remainder digitDiv: powerOfFive neg: false. + (qr at: 2) normalize = 0 ] whileTrue: [ + remainder := (qr at: 1) normalize. + expPowersOfFive add: powerOfFive. + powerOfFive := powerOfFive * powerOfFive ]. + (index := expPowersOfFive size) = 0 ifTrue: [ ^false ]. + [ index >= 1 and: [ remainder ~= 1 " >1 " ] ] whileTrue: [ + powerOfFive := expPowersOfFive at: index. + qr := remainder digitDiv: powerOfFive neg: false. + (qr at: 2) normalize = 0 ifTrue: [ + remainder := (qr at: 1) normalize ]. + index := index - 1 ]. + ^remainder = 1! Item was added: + ----- Method: Fraction>>printAsDecimalFractionIfPossibleOn: (in category 'printing') ----- + printAsDecimalFractionIfPossibleOn: aStream + + | twos fives remainder exponent mantissa | + twos := denominator lowBit - 1. + fives := 0. + (remainder := denominator bitShift: twos negated) ~= 1 " >1 " ifTrue: [ + | powerOfFive expPowersOfFive qr index | + powerOfFive := 5. + expPowersOfFive := OrderedCollection new. + [ + qr := remainder digitDiv: powerOfFive neg: false. + (qr at: 2) normalize = 0 ] whileTrue: [ + remainder := (qr at: 1) normalize. + expPowersOfFive add: powerOfFive. + powerOfFive := powerOfFive * powerOfFive. + fives := fives + (1 bitShift: expPowersOfFive size - 1) ]. + (index := expPowersOfFive size) = 0 ifTrue: [ ^false ]. + [ index >= 1 and: [ remainder ~= 1 " >1 " ] ] whileTrue: [ + powerOfFive := expPowersOfFive at: index. + qr := remainder digitDiv: powerOfFive neg: false. + (qr at: 2) normalize = 0 ifTrue: [ + remainder := (qr at: 1) normalize. + fives := fives + (1 bitShift: index - 1) ]. + index := index - 1 ] ]. + remainder = 1 ifFalse: [ ^false ]. + " denominator has the form of 2^twos * 5^fives " + twos = fives + ifTrue: [ + mantissa := numerator. + exponent := twos ] + ifFalse: [ + twos < fives + ifTrue: [ + mantissa := numerator bitShift: fives - twos. + exponent := fives ] + ifFalse: [ + mantissa := numerator * (5 raisedToInteger: twos - fives). + exponent := twos ] ]. + mantissa printOn: aStream base: 10. + aStream nextPutAll: 'e-'. + exponent printOn: aStream base: 10. + ^true! Item was removed: - ----- Method: Fraction>>printOn: (in category 'printing') ----- - printOn: aStream - - aStream nextPut: $(. - numerator printOn: aStream. - aStream nextPut: $/. - denominator printOn: aStream. - aStream nextPut: $). - ! Item was changed: ----- Method: Fraction>>printOn:base: (in category 'printing') ----- printOn: aStream base: base + (base = 10 and: [ self printAsDecimalFractionIfPossibleOn: aStream ]) ifTrue: [ ^self ]. aStream nextPut: $(. numerator printOn: aStream base: base. aStream nextPut: $/. denominator printOn: aStream base: base. aStream nextPut: $). ! Item was added: + ----- Method: LargeNegativeInteger>>isZero (in category 'testing') ----- + isZero + "Optimization. Answer false since receiver is less than 0." + + ^false + ! Item was added: + ----- Method: LargePositiveInteger>>isZero (in category 'testing') ----- + isZero + "Optimization. Answer false since receiver is greater than 0." + + ^false + ! |
Free forum by Nabble | Edit this page |