--- a/Fraction.st Tue Jun 11 12:06:09 2002 +0200
+++ b/Fraction.st Tue Jun 11 12:06:42 2002 +0200
@@ -413,7 +413,23 @@
asFloat
"return a float with (approximately) my value"
- ^ (numerator asFloat) / (denominator asFloat)
+ |num den numB denB bits|
+
+ (numerator class == SmallInteger and:[denominator class == SmallInteger]) ifTrue:[
+ ^ (numerator asFloat) / (denominator asFloat)
+ ].
+
+ "Do it the hard way: make numbers smaller and redo this on the quotient"
+
+ bits := Float zero numberOfBits * 2. "number of bits to preserve (conservative)"
+ num := numerator abs.
+ den := denominator abs.
+ numB := num highBit - bits.
+ numB > 0 ifTrue:[num := num bitShift:numB negated].
+ denB := den highBit - bits.
+ denB > 0 ifTrue:[den := den bitShift:denB negated].
+
+ ^ (num asFloat / den asFloat) * (2.0 raisedToInteger:numB-denB) * (num sign)
!
asFraction
@@ -805,6 +821,6 @@
!Fraction class methodsFor:'documentation'!
version
- ^ '$Header: /cvs/stx/stx/libbasic/Fraction.st,v 1.54 2002-04-08 10:22:13 stefan Exp $'
+ ^ '$Header: /cvs/stx/stx/libbasic/Fraction.st,v 1.55 2002-06-11 10:06:42 stefan Exp $'
! !
Fraction initialize!