Fraction.st
changeset 6571 101905a14870
parent 6486 38ae7f67ee12
child 6576 c28cdeb0bfb0
--- 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!