The Inbox: Kernel-nice.666.mcz

Previous Topic Next Topic
 
classic Classic list List threaded Threaded
1 message Options
Reply | Threaded
Open this post in threaded view
|

The Inbox: Kernel-nice.666.mcz

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