def __init__(self, *args): nargs = len(args) if nargs == 1 and isinstance(args[0], self.__class__): self._mpfr = args[0]._mpfr return if nargs > 3: raise TypeError("mpfr() requires 0 to 3 arguments") if nargs >= 2: a = self._mpfr = ffi.gc(_new_mpfr(prec=args[1]), _del_mpfr) else: a = self._mpfr = ffi.gc(_new_mpfr(), _del_mpfr) if nargs == 0: gmp.mpfr_set_zero(a, 1) elif nargs == 3: if isinstance(args[0], str): _str_to_mpfr(args[0], args[2], a) else: raise TypeError('function takes at most 2 arguments (%i given)' % nargs) else: if isinstance(args[0], str): _str_to_mpfr(args[0], 10, a) elif isinstance(args[0], float): gmp.mpfr_set_d(a, args[0], gmp.MPFR_RNDN) elif isinstance(args[0], (int, long)): _pyint_to_mpfr(args[0], a) elif isinstance(args[0], mpz): gmp.mpfr_set_z(a, args[0]._mpz, gmp.MPFR_RNDN) elif isinstance(args[0], mpq): gmp.mpfr_set_q(a, args[0]._mpq, gmp.MPFR_RNDN) else: raise TypeError('cannot construct mpfr from %s.' % args[0])
def __pow__(self, other): res = _new_mpfr() if isinstance(other, mpfr): gmp.mpfr_pow(res, self._mpfr, other._mpfr, gmp.MPFR_RNDN) elif isinstance(other, mpq): # There is no mpfr_pow_q gmp.mpfr_set_q(res, other._mpq, gmp.MPFR_RNDN) gmp.mpfr_pow(res, self._mpfr, res, gmp.MPFR_RNDN) elif isinstance(other, mpz): gmp.mpfr_pow_z(res, self._mpfr, other._mpz, gmp.MPFR_RNDN) elif isinstance(other, float): # There is no mpfr_pow_d gmp.mpfr_set_d(res, other, gmp.MPFR_RNDN) gmp.mpfr_pow(res, self._mpfr, res, gmp.MPFR_RNDN) elif isinstance(other, (int, long)): if -sys.maxsize - 1 <= other <= sys.maxsize: gmp.mpfr_pow_si(res, self._mpfr, other, gmp.MPFR_RNDN) elif 0 <= other <= MAX_UI: gmp.mpfr_pow_ui(res, self._mpfr, other, gmp.MPFR_RNDN) else: tmp_mpz = _new_mpz() _pylong_to_mpz(other, tmp_mpz) gmp.mpfr_pow_z(res, self._mpfr, tmp_mpz, gmp.MPFR_RNDN) _del_mpz(tmp_mpz) else: return NotImplemented return mpfr._from_c_mpfr(res)
def __rtruediv__(self, other): res = _new_mpfr() if isinstance(other, mpq): # There is no mpfr_q_div gmp.mpfr_set_q(res, other._mpq, gmp.MPFR_RNDN) gmp.mpfr_div(res, res, self._mpfr, gmp.MPFR_RNDN) pass elif isinstance(other, mpz): # There is no mpfr_z_div gmp.mpfr_set_z(res, other._mpz, gmp.MPFR_RNDN) gmp.mpfr_div(res, res, self._mpfr, gmp.MPFR_RNDN) elif isinstance(other, float): gmp.mpfr_d_div(res, other, self._mpfr, gmp.MPFR_RNDN) elif isinstance(other, (int, long)): if -sys.maxsize - 1 <= other <= sys.maxsize: gmp.mpfr_si_div(res, other, self._mpfr, gmp.MPFR_RNDN) elif 0 <= other <= MAX_UI: gmp.mpfr_ui_div(res, other, self._mpfr, gmp.MPFR_RNDN) else: tmp_mpz = _new_mpz() _pylong_to_mpz(other, tmp_mpz) gmp.mpfr_set_z(res, tmp_mpz, gmp.MPFR_RNDN) gmp.mpfr_div(res, res, self._mpfr, gmp.MPFR_RNDN) _del_mpz(tmp_mpz) else: return NotImplemented return mpfr._from_c_mpfr(res)
def __rpow__(self, other): res = _new_mpfr() if isinstance(other, mpq): # There is no mpfr_pow_q gmp.mpfr_set_q(res, other._mpq, gmp.MPFR_RNDN) gmp.mpfr_pow(res, res, self._mpfr, gmp.MPFR_RNDN) elif isinstance(other, mpz): # There is no mpfr_pow_z gmp.mpfr_set_z(res, other._mpz, gmp.MPFR_RNDN) gmp.mpfr_pow(res, res, self._mpfr, gmp.MPFR_RNDN) elif isinstance(other, float): # There is no mpfr_pow_d gmp.mpfr_set_d(res, other, gmp.MPFR_RNDN) gmp.mpfr_pow(res, res, self._mpfr, gmp.MPFR_RNDN) elif isinstance(other, (int, long)): # There is no mpfr_si_pow _pyint_to_mpfr(other, res) gmp.mpfr_pow(res, res, self._mpfr, gmp.MPFR_RNDN) else: return NotImplemented return mpfr._from_c_mpfr(res)
def __trunc__(self): tmp_mpfr = _new_mpfr() gmp.mpfr_trunc(tmp_mpfr, self._mpfr) res = gmp.mpfr_get_d(tmp_mpfr, gmp.MPFR_RNDN) _del_mpfr(tmp_mpfr) return res
def __abs__(self): res = _new_mpfr() gmp.mpfr_abs(res, self._mpfr, gmp.MPFR_RNDN) return mpfr._from_c_mpfr(res)
def __abs__(self): res = _new_mpfr() gmp.mpc_abs(res, self._mpc, gmp.MPC_RNDNN) return mpfr._from_c_mpfr(res)
def imag(self): _tmp_mpfr = _new_mpfr() gmp.mpc_imag(_tmp_mpfr, self._mpc, gmp.MPC_RNDNN) result = mpfr._from_c_mpfr(_tmp_mpfr) return result