--- 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