[pypy-svn] r75807 - in pypy/branch/fast-forward/pypy/objspace/std: . test

benjamin at codespeak.net benjamin at codespeak.net
Sat Jul 3 00:44:48 CEST 2010


Author: benjamin
Date: Sat Jul  3 00:44:46 2010
New Revision: 75807

Modified:
   pypy/branch/fast-forward/pypy/objspace/std/floatobject.py
   pypy/branch/fast-forward/pypy/objspace/std/floattype.py
   pypy/branch/fast-forward/pypy/objspace/std/test/test_floatobject.py
Log:
add float.as_integer_ratio()

Modified: pypy/branch/fast-forward/pypy/objspace/std/floatobject.py
==============================================================================
--- pypy/branch/fast-forward/pypy/objspace/std/floatobject.py	(original)
+++ pypy/branch/fast-forward/pypy/objspace/std/floatobject.py	Sat Jul  3 00:44:46 2010
@@ -460,6 +460,31 @@
 def getnewargs__Float(space, w_float):
     return space.newtuple([W_FloatObject(w_float.floatval)])
 
+def float_as_integer_ratio__Float(space, w_float):
+    value = w_float.floatval
+    if isinf(value):
+        w_msg = space.wrap("cannot pass infinity to as_integer_ratio()")
+        raise OperationError(space.w_OverflowError, w_msg)
+    elif isnan(value):
+        w_msg = space.wrap("cannot pass nan to as_integer_ratio()")
+        raise OperationError(space.w_ValueError, w_msg)
+    float_part, exp = math.frexp(value)
+    for i in range(300):
+        if float_part == math.floor(float_part):
+            break
+        float_part *= 2.0
+        exp -= 1
+    w_num = W_LongObject.fromfloat(float_part)
+    w_dem = space.newlong(1)
+    w_exp = space.newlong(abs(exp))
+    w_exp = space.lshift(w_dem, w_exp)
+    if exp > 0:
+        w_num = space.mul(w_num, w_exp)
+    else:
+        w_dem = w_exp
+    # Try to return int.
+    return space.newtuple([space.int(w_num), space.int(w_dem)])
+
 from pypy.objspace.std import floattype
 register_all(vars(), floattype)
 

Modified: pypy/branch/fast-forward/pypy/objspace/std/floattype.py
==============================================================================
--- pypy/branch/fast-forward/pypy/objspace/std/floattype.py	(original)
+++ pypy/branch/fast-forward/pypy/objspace/std/floattype.py	Sat Jul  3 00:44:46 2010
@@ -10,6 +10,7 @@
 from pypy.module.sys import system
 
 
+float_as_integer_ratio = SMM("as_integer_ratio", 1)
 float_hex = SMM("hex", 1)
 
 

Modified: pypy/branch/fast-forward/pypy/objspace/std/test/test_floatobject.py
==============================================================================
--- pypy/branch/fast-forward/pypy/objspace/std/test/test_floatobject.py	(original)
+++ pypy/branch/fast-forward/pypy/objspace/std/test/test_floatobject.py	Sat Jul  3 00:44:46 2010
@@ -118,8 +118,20 @@
         assert 42.0 == float(42L)
         assert 10000000000.0 == float(10000000000L)
         raises(OverflowError, float, 10**400)
-        
-        
+
+    def test_as_integer_ratio(self):
+        for f, ratio in [
+                (0.875, (7, 8)),
+                (-0.875, (-7, 8)),
+                (0.0, (0, 1)),
+                (11.5, (23, 2)),
+            ]:
+            assert f.as_integer_ratio() == ratio
+
+        raises(OverflowError, float('inf').as_integer_ratio)
+        raises(OverflowError, float('-inf').as_integer_ratio)
+        raises(ValueError, float('nan').as_integer_ratio)
+
     def test_round(self):
         assert 1.0 == round(1.0)
         assert 1.0 == round(1.1)



More information about the Pypy-commit mailing list