def test_log2(): from rpython.rlib import rfloat assert rfloat.log2(1.0) == 0.0 assert rfloat.log2(2.0) == 1.0 assert rfloat.log2(2.0**1023) == 1023.0 assert 1.584 < rfloat.log2(3.0) < 1.585 py.test.raises(ValueError, rfloat.log2, 0) py.test.raises(ValueError, rfloat.log2, -1)
def _log_any(space, w_x, base): # base is supposed to be positive or 0.0, which means we use e try: try: x = _get_double(space, w_x) except OperationError as e: if not e.match(space, space.w_OverflowError): raise if not space.isinstance_w(w_x, space.w_int): raise # special case to support log(extremely-large-long) num = space.bigint_w(w_x) result = num.log(base) else: if base == 10.0: result = math.log10(x) elif base == 2.0: result = rfloat.log2(x) else: result = math.log(x) if base != 0.0: den = math.log(base) result /= den except OverflowError: raise oefmt(space.w_OverflowError, "math range error") except ValueError: raise oefmt(space.w_ValueError, "math domain error") return space.newfloat(result)