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