--- a/Fraction.st Tue Nov 05 19:28:31 1996 +0100
+++ b/Fraction.st Tue Nov 05 19:36:39 1996 +0100
@@ -40,6 +40,12 @@
integers. Fractions are usually created by dividing Integers using /
(for exact division).
+ Mixed mode arithmetic:
+ fraction op fraction -> fraction
+ fraction op fix -> fix; scale is fix's scale
+ fraction op integer -> fraction
+ fraction op float -> float
+
[author:]
Claus Gittinger
@@ -161,18 +167,22 @@
|n d|
(aNumber isMemberOf:SmallInteger) ifTrue:[
- ^ (self class numerator:(numerator * aNumber)
- denominator:denominator) reduced
+ ^ (self class numerator:(numerator * aNumber)
+ denominator:denominator) reduced
].
aNumber isFraction ifTrue:[
- n := numerator * aNumber numerator.
- d := denominator * aNumber denominator.
- ^ (self class numerator:n denominator:d) reduced
+ aNumber isFixedPoint ifFalse:[ "/ the value was corrent, but the scale is lost
+ n := numerator * aNumber numerator.
+ d := denominator * aNumber denominator.
+ ^ (self class numerator:n denominator:d) reduced
+ ]
].
(aNumber isMemberOf:Float) ifTrue:[
- ^ (numerator * aNumber) / denominator
+ ^ (numerator * aNumber) / denominator
].
^ aNumber productFromFraction:self
+
+ "Modified: 5.11.1996 / 19:31:50 / cg"
!
+ aNumber
@@ -185,24 +195,26 @@
denominator:denominator) reduced
].
aNumber isFraction ifTrue:[
- n := aNumber numerator.
- d := aNumber denominator.
+ aNumber isFixedPoint ifFalse:[ "/ the value was corrent, but the scale is lost
+ n := aNumber numerator.
+ d := aNumber denominator.
- "save a multiplication if possible"
- denominator == d ifTrue:[
- n := numerator + n
- ] ifFalse:[
- n := (numerator * d) + (n * denominator).
- d := denominator * d.
- ].
- ^ (self class numerator:n denominator:d) reduced
+ "save a multiplication if possible"
+ denominator == d ifTrue:[
+ n := numerator + n
+ ] ifFalse:[
+ n := (numerator * d) + (n * denominator).
+ d := denominator * d.
+ ].
+ ^ (self class numerator:n denominator:d) reduced
+ ]
].
(aNumber isMemberOf:Float) ifTrue:[
^ aNumber + (numerator asFloat / denominator asFloat)
].
^ aNumber sumFromFraction:self
- "Modified: 5.11.1996 / 10:27:53 / cg"
+ "Modified: 5.11.1996 / 19:31:41 / cg"
!
- aNumber
@@ -215,24 +227,34 @@
denominator:denominator) reduced
].
aNumber isFraction ifTrue:[
- n := aNumber numerator.
- d := aNumber denominator.
+ aNumber isFixedPoint ifFalse:[ "/ the value was corrent, but the scale is lost
+ n := aNumber numerator.
+ d := aNumber denominator.
- "save a multiplication if possible"
- denominator == d ifTrue:[
- n := numerator - n
- ] ifFalse:[
- n := (numerator * d) - (n * denominator).
- d := denominator * d
- ].
- ^ (self class numerator:n denominator:d) reduced
+ "save a multiplication if possible"
+ denominator == d ifTrue:[
+ n := numerator - n
+ ] ifFalse:[
+ n := (numerator * d) - (n * denominator).
+ d := denominator * d
+ ].
+ ^ (self class numerator:n denominator:d) reduced
+ ]
].
(aNumber isMemberOf:Float) ifTrue:[
^ (numerator asFloat / denominator asFloat) - aNumber
].
^ aNumber differenceFromFraction:self
- "Modified: 5.11.1996 / 10:28:40 / cg"
+ "
+ (1/3) - (1/9)
+ (1/9) - (1/3)
+ (999/1000) - (1/1000)
+ (999/1000) - (1/1000000)
+ (999000/1000000) - (1/1000000)
+ "
+
+ "Modified: 5.11.1996 / 19:31:32 / cg"
!
/ aNumber
@@ -241,18 +263,22 @@
|n d|
(aNumber isMemberOf:SmallInteger) ifTrue:[
- ^ (self class numerator:numerator
- denominator:(denominator * aNumber)) reduced
+ ^ (self class numerator:numerator
+ denominator:(denominator * aNumber)) reduced
].
aNumber isFraction ifTrue:[
- n := numerator * aNumber denominator.
- d := denominator * aNumber numerator.
- ^ (self class numerator:n denominator:d) reduced
+ aNumber isFixedPoint ifFalse:[ "/ the value was corrent, but the scale is lost
+ n := numerator * aNumber denominator.
+ d := denominator * aNumber numerator.
+ ^ (self class numerator:n denominator:d) reduced
+ ]
].
(aNumber isMemberOf:Float) ifTrue:[
- ^ numerator / (denominator * aNumber)
+ ^ numerator / (denominator * aNumber)
].
^ aNumber quotientFromFraction:self
+
+ "Modified: 5.11.1996 / 19:31:23 / cg"
!
// aNumber
@@ -297,6 +323,19 @@
!Fraction methodsFor:'coercing & converting'!
+asFixedPoint
+ "return the receiver as fixedPoint number.
+ Q: what should the scale be here ?"
+
+ ^ FixedPoint numerator:numerator denominator:denominator scale:2
+
+ "
+ (1/2) asFixedPoint
+ "
+
+ "Created: 5.11.1996 / 15:15:54 / cg"
+!
+
asFloat
"return a float with (approximately) my value"
@@ -591,6 +630,6 @@
!Fraction class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/Fraction.st,v 1.33 1996-11-05 11:19:40 cg Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/Fraction.st,v 1.34 1996-11-05 18:36:25 cg Exp $'
! !
Fraction initialize!