Fraction.st
changeset 24135 1172bf7d7292
parent 22895 711322e64257
child 24201 511a59fbb595
--- a/Fraction.st	Wed May 22 19:35:32 2019 +0200
+++ b/Fraction.st	Wed May 22 21:02:04 2019 +0200
@@ -1,5 +1,3 @@
-"{ Encoding: utf8 }"
-
 "
  COPYRIGHT (c) 1989 by Claus Gittinger
 	      All Rights Reserved
@@ -90,64 +88,68 @@
 %{  /* NOCONTEXT */
 #ifdef __SCHTEAM__
     if (self == Fraction.Class) {
-	return context._RETURN(new STFraction(num, den));
+        return context._RETURN(new STFraction(num, den));
     }
 #else
     /* this check allows subclassing .. */
     if (self == Fraction) {
-	if (__bothSmallInteger(num, den)) {
-	    if (den != __mkSmallInteger(0)) {
-		if (__CanDoQuickNew(sizeof(struct __Fraction))) {    /* OBJECT ALLOCATION */
-		    OBJ newFraction;
-		    INT iDen;
-		    INT iNum;
+        if (__bothSmallInteger(num, den)) {
+            if (den != __mkSmallInteger(0)) {
+                if (__CanDoQuickNew(sizeof(struct __Fraction))) {    /* OBJECT ALLOCATION */
+                    OBJ newFraction;
+                    INT iDen;
+                    INT iNum;
 
-		    __qCheckedNew(newFraction, sizeof(struct __Fraction));
-		    __InstPtr(newFraction)->o_class = self;
-		    __qSTORE(newFraction, self);
+                    __qCheckedNew(newFraction, sizeof(struct __Fraction));
+                    __InstPtr(newFraction)->o_class = self;
+                    __qSTORE(newFraction, self);
 
-		    iDen = __intVal(den);
-		    iNum = __intVal(num);
+                    iDen = __intVal(den);
+                    iNum = __intVal(num);
 
-		    if (iDen < 0) {
-			iNum = -iNum;
-			iDen = -iDen;
-		    }
-		    while ( (((iNum | iDen) & 1) == 0) && ( iNum != 0) && ( iDen != 0)) {
-			/* both even and non-zero */
-			iNum = iNum >> 1;
-			iDen = iDen >> 1;
-		    }
-		    if (iNum >= _MAX_INT) {
-			__FractionInstPtr(newFraction)->f_numerator = __MKINT(iNum);
-		    } else {
-			__FractionInstPtr(newFraction)->f_numerator = __MKSMALLINT(iNum);
-		    }
-		    if (iDen >= _MAX_INT) {
-			__FractionInstPtr(newFraction)->f_denominator = __MKINT(iDen);
-		    } else {
-			__FractionInstPtr(newFraction)->f_denominator = __MKSMALLINT(iDen);
-		    }
-		    if (iNum == 1) {
-			/* no need to reduce */
-			RETURN ( newFraction );
-		    }
-		}
-	    }
-	}
+                    if (iDen < 0) {
+                        iNum = -iNum;
+                        iDen = -iDen;
+                    }
+                    while ( (((iNum | iDen) & 1) == 0) && ( iNum != 0) && ( iDen != 0)) {
+                        /* both even and non-zero */
+                        iNum = iNum >> 1;
+                        iDen = iDen >> 1;
+                    }
+                    if (iNum >= _MAX_INT) {
+                        __FractionInstPtr(newFraction)->f_numerator = __MKINT(iNum);
+                    } else {
+                        __FractionInstPtr(newFraction)->f_numerator = __MKSMALLINT(iNum);
+                    }
+                    if (iDen >= _MAX_INT) {
+                        __FractionInstPtr(newFraction)->f_denominator = __MKINT(iDen);
+                    } else {
+                        __FractionInstPtr(newFraction)->f_denominator = __MKSMALLINT(iDen);
+                    }
+                    if (iNum == 1) {
+                        /* no need to reduce */
+                        RETURN ( newFraction );
+                    }
+                }
+            }
+        }
     }
 #endif /* not __SCHTEAM__ */
 %}.
     den = 0 ifTrue:[
-	^ ZeroDivide raiseRequestWith:thisContext.
+        ^ ZeroDivide raiseRequestWith:thisContext.
     ].
     newFraction isNil ifTrue:[
-	newFraction := self basicNew setNumerator:num denominator:den.
+        newFraction := self basicNew setNumerator:num denominator:den.
     ].
     ^ newFraction reduced
 
     "
-     Fraction numerator:1 denominator:3
+     Fraction numerator:1 denominator:3    -> (1/3)
+     Fraction numerator:-1 denominator:3   -> (-1/3)
+     Fraction numerator:1 denominator:-3   -> (-1/3)
+     Fraction numerator:-1 denominator:-3  -> (1/3)
+
      Fraction numerator:2 denominator:3
      Fraction numerator:2 denominator:6