Fraction.st
changeset 2792 2ae1f2e3d11f
parent 2790 495b8ea6a4cb
child 2853 0647da37ba9a
--- a/Fraction.st	Mon Jul 28 18:40:55 1997 +0200
+++ b/Fraction.st	Mon Jul 28 19:11:01 1997 +0200
@@ -75,30 +75,37 @@
 numerator:num denominator:den
     "create and return a new fraction with numerator num and denominator den"
 
+    |newFraction|
+
 %{  /* NOCONTEXT */
 
     /* this check allows subclassing .. */
     if (self == Fraction) {
-	if (__bothSmallInteger(num, den)) {
-	    if (__CanDoQuickAlignedNew(sizeof(struct __fraction))) {
-	        OBJ newFraction;
-	        int spc;
+        if (__bothSmallInteger(num, den)) {
+            if (__CanDoQuickAlignedNew(sizeof(struct __fraction))) {
+                OBJ newFraction;
+                int spc;
 
-	        __qCheckedAlignedNew(newFraction, sizeof(struct __fraction));
-	        __InstPtr(newFraction)->o_class = self;
-		if (__intVal(den) < 0) {
-		    __FractionInstPtr(newFraction)->f_numerator = __MKSMALLINT(- __intVal(num));
-		    __FractionInstPtr(newFraction)->f_denominator = __MKSMALLINT(- __intVal(den));
-		} else {
-	            __FractionInstPtr(newFraction)->f_numerator = num;
-	            __FractionInstPtr(newFraction)->f_denominator = den;
-		}
-	        RETURN ( newFraction );
-	    }
-	}
+                __qCheckedAlignedNew(newFraction, sizeof(struct __fraction));
+                __InstPtr(newFraction)->o_class = self;
+                if (__intVal(den) < 0) {
+                    __FractionInstPtr(newFraction)->f_numerator = __MKSMALLINT(- __intVal(num));
+                    __FractionInstPtr(newFraction)->f_denominator = __MKSMALLINT(- __intVal(den));
+                } else {
+                    __FractionInstPtr(newFraction)->f_numerator = num;
+                    __FractionInstPtr(newFraction)->f_denominator = den;
+                }
+                if (num == __MKSMALLINT(1)) {
+                    RETURN ( newFraction );
+                }
+            }
+        }
     }
 %}.
-    ^ (self basicNew setNumerator:num denominator:den) reduced
+    newFraction isNil ifTrue:[
+        newFraction :=  self basicNew setNumerator:num denominator:den.
+    ].
+    ^ newFraction reduced
 ! !
 
 !Fraction class methodsFor:'constants'!
@@ -169,13 +176,13 @@
 
     (aNumber isMemberOf:SmallInteger) ifTrue:[
         ^ (self class numerator:(numerator * aNumber)
-                    denominator:denominator) reduced
+                    denominator:denominator)
     ].
     aNumber isFraction ifTrue:[
         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
+            ^ (self class numerator:n denominator:d)
         ]
     ].
     (aNumber isMemberOf:Float) ifTrue:[
@@ -183,7 +190,7 @@
     ].
     ^ aNumber productFromFraction:self
 
-    "Modified: 5.11.1996 / 19:31:50 / cg"
+    "Modified: 28.7.1997 / 19:09:23 / cg"
 !
 
 + aNumber
@@ -193,7 +200,7 @@
 
     (aNumber isMemberOf:SmallInteger) ifTrue:[
         ^ (self class numerator:(numerator + (denominator * aNumber))
-                    denominator:denominator) reduced
+                    denominator:denominator)
     ].
     aNumber isFraction ifTrue:[
         aNumber isFixedPoint ifFalse:[  "/ the value was corrent, but the scale is lost
@@ -207,7 +214,7 @@
                 n := (numerator * d) + (n * denominator).
                 d := denominator * d.
             ].
-            ^ (self class numerator:n denominator:d) reduced
+            ^ (self class numerator:n denominator:d)
         ]
     ].
     (aNumber isMemberOf:Float) ifTrue:[
@@ -215,7 +222,7 @@
     ].
     ^ aNumber sumFromFraction:self
 
-    "Modified: 5.11.1996 / 19:31:41 / cg"
+    "Modified: 28.7.1997 / 19:09:16 / cg"
 !
 
 - aNumber
@@ -225,7 +232,7 @@
 
     (aNumber isMemberOf:SmallInteger) ifTrue:[
         ^ (self class numerator:(numerator - (denominator * aNumber))
-                    denominator:denominator) reduced
+                    denominator:denominator)
     ].
     aNumber isFraction ifTrue:[
         aNumber isFixedPoint ifFalse:[  "/ the value was corrent, but the scale is lost
@@ -239,7 +246,7 @@
                 n := (numerator * d) - (n * denominator).
                 d := denominator * d
             ].
-            ^ (self class numerator:n denominator:d) reduced
+            ^ (self class numerator:n denominator:d)
         ]
     ].
     (aNumber isMemberOf:Float) ifTrue:[
@@ -255,7 +262,7 @@
      (999000/1000000) - (1/1000000)      
     "
 
-    "Modified: 5.11.1996 / 19:31:32 / cg"
+    "Modified: 28.7.1997 / 19:09:11 / cg"
 !
 
 / aNumber
@@ -265,13 +272,13 @@
 
     (aNumber isMemberOf:SmallInteger) ifTrue:[
         ^ (self class numerator:numerator
-                    denominator:(denominator * aNumber)) reduced
+                    denominator:(denominator * aNumber))
     ].
     aNumber isFraction ifTrue:[
         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
+            ^ (self class numerator:n denominator:d)
         ]
     ].
     (aNumber isMemberOf:Float) ifTrue:[
@@ -279,7 +286,7 @@
     ].
     ^ aNumber quotientFromFraction:self
 
-    "Modified: 5.11.1996 / 19:31:23 / cg"
+    "Modified: 28.7.1997 / 19:09:06 / cg"
 !
 
 // aNumber
@@ -478,9 +485,9 @@
 
     ^ (self class 
         numerator:((anInteger * denominator) - numerator)
-        denominator:denominator) reduced
+        denominator:denominator)
 
-    "Modified: 5.11.1996 / 10:32:14 / cg"
+    "Modified: 28.7.1997 / 19:08:53 / cg"
 !
 
 lessFromInteger:anInteger
@@ -500,9 +507,9 @@
 
     ^ (self class 
         numerator:(anInteger * numerator)
-        denominator:denominator) reduced
+        denominator:denominator)
 
-    "Modified: 5.11.1996 / 10:32:28 / cg"
+    "Modified: 28.7.1997 / 19:06:22 / cg"
 !
 
 quotientFromFloat:aFloat
@@ -516,9 +523,9 @@
 
     ^ (self class 
         numerator:(anInteger * denominator)
-        denominator:numerator) reduced
+        denominator:numerator)
 
-    "Modified: 5.11.1996 / 10:32:35 / cg"
+    "Modified: 28.7.1997 / 19:08:46 / cg"
 !
 
 sumFromFloat:aFloat
@@ -532,9 +539,9 @@
 
     ^ (self class 
         numerator:(numerator + (anInteger * denominator))
-        denominator:denominator) reduced
+        denominator:denominator)
 
-    "Modified: 5.11.1996 / 10:32:43 / cg"
+    "Modified: 28.7.1997 / 19:08:40 / cg"
 ! !
 
 !Fraction methodsFor:'printing & storing'!
@@ -649,6 +656,6 @@
 !Fraction class methodsFor:'documentation'!
 
 version
-    ^ '$Header: /cvs/stx/stx/libbasic/Fraction.st,v 1.38 1997-07-28 15:08:53 cg Exp $'
+    ^ '$Header: /cvs/stx/stx/libbasic/Fraction.st,v 1.39 1997-07-28 17:11:01 cg Exp $'
 ! !
 Fraction initialize!