A new version of Kernel was added to project The Inbox:
http://source.squeak.org/inbox/Kernel-nice.666.mcz ==================== Summary ==================== Name: Kernel-nice.666 Author: nice Time: 22 January 2012, 7:21:56.763 pm UUID: 471545e4-437f-4366-bacb-3d86d68f0ba0 Ancestors: Kernel-nice.665, Kernel-nice.643 merge and correct Kernel-nice.643 (3/2)/(-3/4) was bogus Reminder: these changes should speed up mixed Integer-Fraction arithmetic (they avoid creating intermediate Fraction) =============== Diff against Kernel-nice.665 =============== Item was changed: ----- Method: Fraction>>- (in category 'arithmetic') ----- - aNumber "Answer the difference between the receiver and aNumber." + | n d d1 d2 | aNumber isFraction ifTrue: + [d := denominator gcd: aNumber denominator. + n := numerator * (d1 := aNumber denominator // d) - (aNumber numerator * (d2 := denominator // d)). + d1 := d1 * d2. + n := n // (d2 := n gcd: d). + (d := d1 * (d // d2)) = 1 ifTrue: [^ n]. + ^ Fraction numerator: n denominator: d]. - [^ self + aNumber negated]. ^ aNumber adaptToFraction: self andSend: #-! Item was changed: ----- Method: Fraction>>/ (in category 'arithmetic') ----- / aNumber "Answer the result of dividing the receiver by aNumber." + | d1 d2 | + aNumber isFraction ifTrue: + [d1 := numerator gcd: aNumber numerator. + d2 := denominator gcd: aNumber denominator. + (d2 = denominator and: [d1 = aNumber numerator abs]) + ifTrue: [^ numerator // d1 * (aNumber numerator copySignTo: aNumber denominator // d2)]. + ^ Fraction numerator: numerator // d1 * (aNumber denominator // d2) + denominator: denominator // d2 * (aNumber numerator // d1)]. - aNumber isFraction - ifTrue: [^self * aNumber reciprocal]. ^ aNumber adaptToFraction: self andSend: #/! Item was changed: ----- Method: Integer>>* (in category 'arithmetic') ----- * aNumber "Refer to the comment in Number * " aNumber isInteger ifTrue: [^ self digitMultiply: aNumber + neg: self negative == aNumber negative == false]. + aNumber isFraction + ifTrue: + [| n d | + n := self // (d := self gcd: aNumber denominator). + d := aNumber denominator // d. + ^d = 1 + ifTrue: [n * aNumber numerator] + ifFalse: [Fraction numerator: n * aNumber numerator denominator: d]]. - neg: self negative ~~ aNumber negative]. ^ aNumber adaptToInteger: self andSend: #*! Item was changed: ----- Method: Integer>>+ (in category 'arithmetic') ----- + aNumber "Refer to the comment in Number + " aNumber isInteger ifTrue: [self negative == aNumber negative ifTrue: [^ (self digitAdd: aNumber) normalize] ifFalse: [^ self digitSubtract: aNumber]]. + aNumber isFraction ifTrue: [^Fraction numerator: self * aNumber denominator + aNumber numerator denominator: aNumber denominator]. ^ aNumber adaptToInteger: self andSend: #+! Item was changed: ----- Method: Integer>>- (in category 'arithmetic') ----- - aNumber "Refer to the comment in Number - " aNumber isInteger ifTrue: [self negative == aNumber negative ifTrue: [^ self digitSubtract: aNumber] ifFalse: [^ (self digitAdd: aNumber) normalize]]. + aNumber isFraction ifTrue: [^Fraction numerator: self * aNumber denominator - aNumber numerator denominator: aNumber denominator]. ^ aNumber adaptToInteger: self andSend: #-! Item was changed: ----- Method: Integer>>/ (in category 'arithmetic') ----- / aNumber "Refer to the comment in Number / " | quoRem | aNumber isInteger ifTrue: [quoRem := self digitDiv: aNumber abs "*****I've added abs here*****" + neg: self negative == aNumber negative == false. - neg: self negative ~~ aNumber negative. (quoRem at: 2) = 0 ifTrue: [^ (quoRem at: 1) normalize] ifFalse: [^ (Fraction numerator: self denominator: aNumber) reduced]]. + aNumber isFraction + ifTrue: + [| n d | + n := self // (d := self gcd: aNumber numerator). + d := aNumber numerator // d. + ^d abs = 1 + ifTrue: [n * aNumber denominator * d] + ifFalse: [Fraction numerator: n * aNumber denominator denominator: d]]. ^ aNumber adaptToInteger: self andSend: #/! |
Free forum by Nabble | Edit this page |