Author: Manuel Jacob Branch: py3k Changeset: r61511:60e8bbf6448f Date: 2013-02-21 00:36 +0100 http://bitbucket.org/pypy/pypy/changeset/60e8bbf6448f/
Log: hg merge default diff --git a/pypy/module/_io/interp_fileio.py b/pypy/module/_io/interp_fileio.py --- a/pypy/module/_io/interp_fileio.py +++ b/pypy/module/_io/interp_fileio.py @@ -3,6 +3,7 @@ from pypy.interpreter.error import OperationError, wrap_oserror, wrap_oserror2 from rpython.rlib.rarithmetic import r_longlong from rpython.rlib.rstring import StringBuilder +from rpython.rlib.rposix import validate_fd from os import O_RDONLY, O_WRONLY, O_RDWR, O_CREAT, O_TRUNC import sys, os, stat, errno from pypy.module._io.interp_iobase import W_RawIOBase, convert_size @@ -117,9 +118,6 @@ return currentsize + BIGCHUNK return currentsize + SMALLCHUNK -def verify_fd(fd): - return - class W_FileIO(W_RawIOBase): def __init__(self, space): W_RawIOBase.__init__(self, space) @@ -156,7 +154,7 @@ fd_is_own = False try: if fd >= 0: - verify_fd(fd) + validate_fd(fd) try: os.fstat(fd) except OSError, e: @@ -233,7 +231,7 @@ self.fd = -1 try: - verify_fd(fd) + validate_fd(fd) os.close(fd) except OSError, e: raise wrap_oserror(space, e, diff --git a/pypy/module/micronumpy/interp_numarray.py b/pypy/module/micronumpy/interp_numarray.py --- a/pypy/module/micronumpy/interp_numarray.py +++ b/pypy/module/micronumpy/interp_numarray.py @@ -250,7 +250,7 @@ ret = self.implementation.get_imag(self) if ret: return W_NDimArray(ret) - raise OperationError(space.w_NotImplementedError, + raise OperationError(space.w_NotImplementedError, space.wrap('imag not implemented for this dtype')) def descr_set_real(self, space, w_value): @@ -261,7 +261,7 @@ def descr_set_imag(self, space, w_value): # if possible, copy (broadcast) values into self if not self.get_dtype().is_complex_type(): - raise OperationError(space.w_TypeError, + raise OperationError(space.w_TypeError, space.wrap('array does not have imaginary part to set')) tmp = self.implementation.get_imag(self) tmp.setslice(space, convert_to_array(space, w_value)) @@ -302,11 +302,11 @@ @unwrap_spec(axis1=int, axis2=int) def descr_swapaxes(self, space, axis1, axis2): """a.swapaxes(axis1, axis2) - + Return a view of the array with `axis1` and `axis2` interchanged. - + Refer to `numpy.swapaxes` for full documentation. - + See Also -------- numpy.swapaxes : equivalent function @@ -439,7 +439,7 @@ ret = impl.base() if ret is None: return space.w_None - return ret + return ret @unwrap_spec(inplace=bool) def descr_byteswap(self, space, inplace=False): @@ -492,7 +492,7 @@ "axis1 and axis2 cannot be the same")) return interp_arrayops.diagonal(space, self.implementation, offset, axis1, axis2) - + def descr_dump(self, space, w_file): raise OperationError(space.w_NotImplementedError, space.wrap( "dump not implemented yet")) @@ -509,7 +509,7 @@ raise OperationError(space.w_NotImplementedError, space.wrap( "setting flags not implemented yet")) - @unwrap_spec(offset=int) + @unwrap_spec(offset=int) def descr_getfield(self, space, w_dtype, offset): raise OperationError(space.w_NotImplementedError, space.wrap( "getfield not implemented yet")) @@ -518,7 +518,7 @@ raise OperationError(space.w_NotImplementedError, space.wrap( "itemset not implemented yet")) - @unwrap_spec(neworder=str) + @unwrap_spec(neworder=str) def descr_newbyteorder(self, space, neworder): raise OperationError(space.w_NotImplementedError, space.wrap( "newbyteorder not implemented yet")) @@ -551,7 +551,7 @@ raise OperationError(space.w_NotImplementedError, space.wrap( "setfield not implemented yet")) - def descr_setflags(self, space, w_write=None, w_align=None, w_uic=None): + def descr_setflags(self, space, w_write=None, w_align=None, w_uic=None): raise OperationError(space.w_NotImplementedError, space.wrap( "setflags not implemented yet")) @@ -572,7 +572,7 @@ "tofile not implemented yet")) def descr_trace(self, space, w_offset=0, w_axis1=0, w_axis2=1, - w_dtype=None, w_out=None): + w_dtype=None, w_out=None): raise OperationError(space.w_NotImplementedError, space.wrap( "trace not implemented yet")) @@ -627,21 +627,23 @@ w_remainder = self.descr_mod(space, w_other) return space.newtuple([w_quotient, w_remainder]) - _descr_eq = _binop_impl("equal") + def _binop_comp_impl(ufunc): + def impl(self, space, w_other, w_out=None): + try: + return ufunc(self, space, w_other, w_out) + except OperationError, e: + if e.match(space, space.w_ValueError): + return space.w_False + raise e - def descr_eq(self, space, w_other): - try: - return self._descr_eq(space, w_other) - except OperationError, e: - if e.match(space, space.w_ValueError): - return space.w_False - raise e + return func_with_new_name(impl, ufunc.func_name) - descr_ne = _binop_impl("not_equal") - descr_lt = _binop_impl("less") - descr_le = _binop_impl("less_equal") - descr_gt = _binop_impl("greater") - descr_ge = _binop_impl("greater_equal") + descr_eq = _binop_comp_impl(_binop_impl("equal")) + descr_ne = _binop_comp_impl(_binop_impl("not_equal")) + descr_lt = _binop_comp_impl(_binop_impl("less")) + descr_le = _binop_comp_impl(_binop_impl("less_equal")) + descr_gt = _binop_comp_impl(_binop_impl("greater")) + descr_ge = _binop_comp_impl(_binop_impl("greater_equal")) def _binop_right_impl(ufunc_name): def impl(self, space, w_other, w_out=None): @@ -707,7 +709,7 @@ if space.is_none(w_out): out = None elif not isinstance(w_out, W_NDimArray): - raise OperationError(space.w_TypeError, space.wrap( + raise OperationError(space.w_TypeError, space.wrap( 'output must be an array')) else: out = w_out @@ -727,7 +729,7 @@ descr_cumsum = _reduce_ufunc_impl('add', cumultative=True) descr_cumprod = _reduce_ufunc_impl('multiply', cumultative=True) - + def descr_mean(self, space, w_axis=None, w_out=None): if space.is_none(w_axis): w_denom = space.wrap(self.get_size()) @@ -872,7 +874,7 @@ swapaxes = interp2app(W_NDimArray.descr_swapaxes), flat = GetSetProperty(W_NDimArray.descr_get_flatiter), item = interp2app(W_NDimArray.descr_item), - real = GetSetProperty(W_NDimArray.descr_get_real, + real = GetSetProperty(W_NDimArray.descr_get_real, W_NDimArray.descr_set_real), imag = GetSetProperty(W_NDimArray.descr_get_imag, W_NDimArray.descr_set_imag), @@ -932,7 +934,7 @@ dtype) #if dtype is interp_dtype.get_dtype_cache(space).w_float64dtype: # break - + if dtype is None: dtype = interp_dtype.get_dtype_cache(space).w_float64dtype if ndmin > len(shape): 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 @@ -10,7 +10,7 @@ from rpython.rlib.rarithmetic import ovfcheck_float_to_int, intmask, LONG_BIT from rpython.rlib.rfloat import ( isinf, isnan, isfinite, INFINITY, NAN, copysign, formatd, - DTSF_ADD_DOT_0, DTSF_STR_PRECISION) + DTSF_ADD_DOT_0, DTSF_STR_PRECISION, float_as_rbigint_ratio) from rpython.rlib.rbigint import rbigint from rpython.rlib import rfloat from rpython.tool.sourcetools import func_with_new_name @@ -544,27 +544,18 @@ def float_as_integer_ratio__Float(space, w_float): value = w_float.floatval - if isinf(value): + try: + num, den = float_as_rbigint_ratio(value) + except OverflowError: w_msg = space.wrap("cannot pass infinity to as_integer_ratio()") raise OperationError(space.w_OverflowError, w_msg) - elif isnan(value): + except ValueError: 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(space, float_part) - w_den = space.newlong(1) - w_exp = space.newlong(abs(exp)) - w_exp = space.lshift(w_den, w_exp) - if exp > 0: - w_num = space.mul(w_num, w_exp) - else: - w_den = w_exp - # Try to return int. + + w_num = space.newlong_from_rbigint(num) + w_den = space.newlong_from_rbigint(den) + # Try to return int return space.newtuple([space.int(w_num), space.int(w_den)]) def float_is_integer__Float(space, w_float): diff --git a/rpython/rlib/rfloat.py b/rpython/rlib/rfloat.py --- a/rpython/rlib/rfloat.py +++ b/rpython/rlib/rfloat.py @@ -419,3 +419,25 @@ def isfinite(x): "NOT_RPYTHON" return not isinf(x) and not isnan(x) + +def float_as_rbigint_ratio(value): + from rpython.rlib.rbigint import rbigint + + if isinf(value): + raise OverflowError("cannot pass infinity to as_integer_ratio()") + elif isnan(value): + raise ValueError("cannot pass nan to as_integer_ratio()") + float_part, exp_int = math.frexp(value) + for i in range(300): + if float_part == math.floor(float_part): + break + float_part *= 2.0 + exp_int -= 1 + num = rbigint.fromfloat(float_part) + den = rbigint.fromint(1) + exp = den.lshift(abs(exp_int)) + if exp_int > 0: + num = num.mul(exp) + else: + den = exp + return num, den diff --git a/rpython/rlib/test/test_rfloat.py b/rpython/rlib/test/test_rfloat.py new file mode 100644 --- /dev/null +++ b/rpython/rlib/test/test_rfloat.py @@ -0,0 +1,131 @@ +import sys, py + +from rpython.rlib.rfloat import float_as_rbigint_ratio +from rpython.rlib.rfloat import break_up_float +from rpython.rlib.rfloat import copysign +from rpython.rlib.rfloat import round_away +from rpython.rlib.rfloat import round_double +from rpython.rlib.rbigint import rbigint + +def test_copysign(): + assert copysign(1, 1) == 1 + assert copysign(-1, 1) == 1 + assert copysign(-1, -1) == -1 + assert copysign(1, -1) == -1 + assert copysign(1, -0.) == -1 + +def test_round_away(): + assert round_away(.1) == 0. + assert round_away(.5) == 1. + assert round_away(.7) == 1. + assert round_away(1.) == 1. + assert round_away(-.5) == -1. + assert round_away(-.1) == 0. + assert round_away(-.7) == -1. + assert round_away(0.) == 0. + +def test_round_double(): + def almost_equal(x, y): + assert round(abs(x-y), 7) == 0 + + almost_equal(round_double(0.125, 2), 0.13) + almost_equal(round_double(0.375, 2), 0.38) + almost_equal(round_double(0.625, 2), 0.63) + almost_equal(round_double(0.875, 2), 0.88) + almost_equal(round_double(-0.125, 2), -0.13) + almost_equal(round_double(-0.375, 2), -0.38) + almost_equal(round_double(-0.625, 2), -0.63) + almost_equal(round_double(-0.875, 2), -0.88) + + almost_equal(round_double(0.25, 1), 0.3) + almost_equal(round_double(0.75, 1), 0.8) + almost_equal(round_double(-0.25, 1), -0.3) + almost_equal(round_double(-0.75, 1), -0.8) + + round_double(-6.5, 0) == -7.0 + round_double(-5.5, 0) == -6.0 + round_double(-1.5, 0) == -2.0 + round_double(-0.5, 0) == -1.0 + round_double(0.5, 0) == 1.0 + round_double(1.5, 0) == 2.0 + round_double(2.5, 0) == 3.0 + round_double(3.5, 0) == 4.0 + round_double(4.5, 0) == 5.0 + round_double(5.5, 0) == 6.0 + round_double(6.5, 0) == 7.0 + + round_double(-25.0, -1) == -30.0 + round_double(-15.0, -1) == -20.0 + round_double(-5.0, -1) == -10.0 + round_double(5.0, -1) == 10.0 + round_double(15.0, -1) == 20.0 + round_double(25.0, -1) == 30.0 + round_double(35.0, -1) == 40.0 + round_double(45.0, -1) == 50.0 + round_double(55.0, -1) == 60.0 + round_double(65.0, -1) == 70.0 + round_double(75.0, -1) == 80.0 + round_double(85.0, -1) == 90.0 + round_double(95.0, -1) == 100.0 + round_double(12325.0, -1) == 12330.0 + + round_double(350.0, -2) == 400.0 + round_double(450.0, -2) == 500.0 + + almost_equal(round_double(0.5e21, -21), 1e21) + almost_equal(round_double(1.5e21, -21), 2e21) + almost_equal(round_double(2.5e21, -21), 3e21) + almost_equal(round_double(5.5e21, -21), 6e21) + almost_equal(round_double(8.5e21, -21), 9e21) + + almost_equal(round_double(-1.5e22, -22), -2e22) + almost_equal(round_double(-0.5e22, -22), -1e22) + almost_equal(round_double(0.5e22, -22), 1e22) + almost_equal(round_double(1.5e22, -22), 2e22) + +def test_round_half_even(): + from rpython.rlib import rfloat + for func in (rfloat.round_double_short_repr, + rfloat.round_double_fallback_repr): + # 2.x behavior + assert func(2.5, 0, False) == 3.0 + # 3.x behavior + assert func(2.5, 0, True) == 2.0 + +def test_break_up_float(): + assert break_up_float('1') == ('', '1', '', '') + assert break_up_float('+1') == ('+', '1', '', '') + assert break_up_float('-1') == ('-', '1', '', '') + + assert break_up_float('.5') == ('', '', '5', '') + + assert break_up_float('1.2e3') == ('', '1', '2', '3') + assert break_up_float('1.2e+3') == ('', '1', '2', '+3') + assert break_up_float('1.2e-3') == ('', '1', '2', '-3') + + # some that will get thrown out on return: + assert break_up_float('.') == ('', '', '', '') + assert break_up_float('+') == ('+', '', '', '') + assert break_up_float('-') == ('-', '', '', '') + assert break_up_float('e1') == ('', '', '', '1') + + py.test.raises(ValueError, break_up_float, 'e') + + +def test_float_as_rbigint_ratio(): + for f, ratio in [ + (0.875, (7, 8)), + (-0.875, (-7, 8)), + (0.0, (0, 1)), + (11.5, (23, 2)), + ]: + num, den = float_as_rbigint_ratio(f) + assert num.eq(rbigint.fromint(ratio[0])) + assert den.eq(rbigint.fromint(ratio[1])) + + with py.test.raises(OverflowError): + float_as_rbigint_ratio(float('inf')) + with py.test.raises(OverflowError): + float_as_rbigint_ratio(float('-inf')) + with py.test.raises(ValueError): + float_as_rbigint_ratio(float('nan')) diff --git a/rpython/rtyper/test/test_rfloat.py b/rpython/rtyper/test/test_rfloat.py --- a/rpython/rtyper/test/test_rfloat.py +++ b/rpython/rtyper/test/test_rfloat.py @@ -216,26 +216,6 @@ # https://bugzilla.novell.com/show_bug.cgi?id=692493 assert not self.interpret(fn, [1e200, 1e200]) # nan - def test_break_up_float(self): - from rpython.rlib.rfloat import break_up_float - assert break_up_float('1') == ('', '1', '', '') - assert break_up_float('+1') == ('+', '1', '', '') - assert break_up_float('-1') == ('-', '1', '', '') - - assert break_up_float('.5') == ('', '', '5', '') - - assert break_up_float('1.2e3') == ('', '1', '2', '3') - assert break_up_float('1.2e+3') == ('', '1', '2', '+3') - assert break_up_float('1.2e-3') == ('', '1', '2', '-3') - - # some that will get thrown out on return: - assert break_up_float('.') == ('', '', '', '') - assert break_up_float('+') == ('+', '', '', '') - assert break_up_float('-') == ('-', '', '', '') - assert break_up_float('e1') == ('', '', '', '1') - - py.test.raises(ValueError, break_up_float, 'e') - def test_formatd(self): from rpython.rlib.rfloat import formatd def f(x): @@ -296,93 +276,6 @@ assert self.interpret(func, [0]) == 1e23 assert self.interpret(func, [1]) == -1e23 - def test_copysign(self): - from rpython.rlib.rfloat import copysign - assert copysign(1, 1) == 1 - assert copysign(-1, 1) == 1 - assert copysign(-1, -1) == -1 - assert copysign(1, -1) == -1 - assert copysign(1, -0.) == -1 - - def test_round_away(self): - from rpython.rlib.rfloat import round_away - assert round_away(.1) == 0. - assert round_away(.5) == 1. - assert round_away(.7) == 1. - assert round_away(1.) == 1. - assert round_away(-.5) == -1. - assert round_away(-.1) == 0. - assert round_away(-.7) == -1. - assert round_away(0.) == 0. - - def test_round_double(self): - from rpython.rlib.rfloat import round_double - def almost_equal(x, y): - assert round(abs(x-y), 7) == 0 - - almost_equal(round_double(0.125, 2), 0.13) - almost_equal(round_double(0.375, 2), 0.38) - almost_equal(round_double(0.625, 2), 0.63) - almost_equal(round_double(0.875, 2), 0.88) - almost_equal(round_double(-0.125, 2), -0.13) - almost_equal(round_double(-0.375, 2), -0.38) - almost_equal(round_double(-0.625, 2), -0.63) - almost_equal(round_double(-0.875, 2), -0.88) - - almost_equal(round_double(0.25, 1), 0.3) - almost_equal(round_double(0.75, 1), 0.8) - almost_equal(round_double(-0.25, 1), -0.3) - almost_equal(round_double(-0.75, 1), -0.8) - - round_double(-6.5, 0) == -7.0 - round_double(-5.5, 0) == -6.0 - round_double(-1.5, 0) == -2.0 - round_double(-0.5, 0) == -1.0 - round_double(0.5, 0) == 1.0 - round_double(1.5, 0) == 2.0 - round_double(2.5, 0) == 3.0 - round_double(3.5, 0) == 4.0 - round_double(4.5, 0) == 5.0 - round_double(5.5, 0) == 6.0 - round_double(6.5, 0) == 7.0 - - round_double(-25.0, -1) == -30.0 - round_double(-15.0, -1) == -20.0 - round_double(-5.0, -1) == -10.0 - round_double(5.0, -1) == 10.0 - round_double(15.0, -1) == 20.0 - round_double(25.0, -1) == 30.0 - round_double(35.0, -1) == 40.0 - round_double(45.0, -1) == 50.0 - round_double(55.0, -1) == 60.0 - round_double(65.0, -1) == 70.0 - round_double(75.0, -1) == 80.0 - round_double(85.0, -1) == 90.0 - round_double(95.0, -1) == 100.0 - round_double(12325.0, -1) == 12330.0 - - round_double(350.0, -2) == 400.0 - round_double(450.0, -2) == 500.0 - - almost_equal(round_double(0.5e21, -21), 1e21) - almost_equal(round_double(1.5e21, -21), 2e21) - almost_equal(round_double(2.5e21, -21), 3e21) - almost_equal(round_double(5.5e21, -21), 6e21) - almost_equal(round_double(8.5e21, -21), 9e21) - - almost_equal(round_double(-1.5e22, -22), -2e22) - almost_equal(round_double(-0.5e22, -22), -1e22) - almost_equal(round_double(0.5e22, -22), 1e22) - almost_equal(round_double(1.5e22, -22), 2e22) - - def test_round_half_even(self): - from rpython.rlib import rfloat - for func in (rfloat.round_double_short_repr, - rfloat.round_double_fallback_repr): - # 2.x behavior - assert func(2.5, 0, False) == 3.0 - # 3.x behavior - assert func(2.5, 0, True) == 2.0 class TestLLtype(BaseTestRfloat, LLRtypeMixin): _______________________________________________ pypy-commit mailing list pypy-commit@python.org http://mail.python.org/mailman/listinfo/pypy-commit