Fraction.st
changeset 1892 d3564145c15c
parent 1878 5615af5e7f47
child 1893 c66af5c46272
--- 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!