[squeak-dev] The Inbox: Kernel-nice.666.mcz

commits at source.squeak.org commits at source.squeak.org
Sun Jan 22 18:22:37 UTC 2012


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: #/!




More information about the Squeak-dev mailing list