def evalf_log(expr, prec, options): arg = expr.args[0] workprec = prec+10 xre, xim, xacc, _ = evalf(arg, workprec, options) if xim: # XXX: use get_abs etc instead re = evalf_log(C.log(C.abs(arg, evaluate=False), evaluate=False), prec, options) im = mpf_atan2(xim, xre or fzero, prec) return re[0], im, re[2], prec imaginary_term = (mpf_cmp(xre, fzero) < 0) re = mpf_log(mpf_abs(xre), prec, round_nearest) size = fastlog(re) if prec - size > workprec: # We actually need to compute 1+x accurately, not x arg = C.Add(S.NegativeOne,arg,evaluate=False) xre, xim, xre_acc, xim_acc = evalf_add(arg, prec, options) prec2 = workprec - fastlog(xre) re = mpf_log(mpf_add(xre, fone, prec2), prec, round_nearest) re_acc = prec if imaginary_term: return re, mpf_pi(prec), re_acc, prec else: return re, None, re_acc, None
def get_abs(expr, prec, options): re, im, re_acc, im_acc = evalf(expr, prec+2, options) if not re: re, re_acc, im, im_acc = im, im_acc, re, re_acc if im: return libmpc.mpc_abs((re, im), prec), None, re_acc, None else: return mpf_abs(re), None, re_acc, None
def __abs__(self): return Real._new(mlib.mpf_abs(self._mpf_), self._prec)