Author: Armin Rigo <ar...@tunes.org> Branch: Changeset: r47050:6c5b36d058ec Date: 2011-09-03 17:51 +0200 http://bitbucket.org/pypy/pypy/changeset/6c5b36d058ec/
Log: merge heads diff --git a/pypy/objspace/std/floatobject.py b/pypy/objspace/std/floatobject.py --- a/pypy/objspace/std/floatobject.py +++ b/pypy/objspace/std/floatobject.py @@ -355,9 +355,13 @@ y = w_float2.floatval if y == 0.0: raise FailedToImplementArgs(space.w_ZeroDivisionError, space.wrap("float modulo")) - mod = math.fmod(x, y) - if (mod and ((y < 0.0) != (mod < 0.0))): - mod += y + try: + mod = math.fmod(x, y) + except ValueError: + mod = rfloat.NAN + else: + if (mod and ((y < 0.0) != (mod < 0.0))): + mod += y return W_FloatObject(mod) @@ -366,7 +370,10 @@ y = w_float2.floatval if y == 0.0: raise FailedToImplementArgs(space.w_ZeroDivisionError, space.wrap("float modulo")) - mod = math.fmod(x, y) + try: + mod = math.fmod(x, y) + except ValueError: + return [W_FloatObject(rfloat.NAN), W_FloatObject(rfloat.NAN)] # fmod is typically exact, so vx-mod is *mathematically* an # exact multiple of wx. But this is fp arithmetic, and fp # vx - mod is an approximation; the result is that div may diff --git a/pypy/objspace/std/test/test_floatobject.py b/pypy/objspace/std/test/test_floatobject.py --- a/pypy/objspace/std/test/test_floatobject.py +++ b/pypy/objspace/std/test/test_floatobject.py @@ -767,3 +767,19 @@ def test_invalid(self): raises(ValueError, float.fromhex, "0P") + + def test_division_edgecases(self): + import math + + # inf + inf = float("inf") + assert math.isnan(inf % 3) + assert math.isnan(inf // 3) + x, y = divmod(inf, 3) + assert math.isnan(x) + assert math.isnan(y) + + # divide by 0 + raises(ZeroDivisionError, lambda: inf % 0) + raises(ZeroDivisionError, lambda: inf // 0) + raises(ZeroDivisionError, divmod, inf, 0) \ No newline at end of file _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit