[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