def _init_check_mpc(x): """ Returns a new mpc and a pointer to a c mpc storing the value of x """ if isinstance(x, mpc): res = _new_mpc() mpc_x = x._mpc elif isinstance(x, complex): res = _new_mpc() mpc_x = res # avoid initialising another c mpc gmp.mpc_set_d_d(mpc_x, x.real, x.imag, gmp.MPC_RNDNN) elif isinstance(x, mpfr): res = _new_mpc() mpc_x = res # avoid initialising another c mpc gmp.mpc_set_fr(mpc_x, x, gmp.MPC_RNDNN) elif isinstance(x, float): res = _new_mpc() gmp.mpc_set_d(mpc_x, x, gmp.MPC_RNDNN) elif isinstance(x, (int, long)): res = _new_mpc() mpc_x = res # avoid initialising another c mpc _pyint_to_mpfr(x, gmp.mpc_realref(mpc_x)) gmp.mpfr_set_ui(gmp.mpc_imagref(mpc_x), 0, gmp.MPC_RNDNN) elif isinstance(x, mpz): res = _new_mpc() mpc_x = res # avoid initialising another c mpc gmp.mpc_set_z(mpc_x, x._mpz, gmp.MPC_RNDNN) elif isinstance(x, mpq): res = _new_mpc() mpc_x = res # avoid initialising another c mpc gmp.mpc_set_q(mpc_x, x._mpq, gmp.MPC_RNDNN) else: raise TypeError return res, mpc_x
def _pyint_to_mpfr(n, a): if -sys.maxsize - 1 <= n <= sys.maxsize: gmp.mpfr_set_si(a, n, gmp.MPFR_RNDN) elif sys.maxsize < n <= MAX_UI: gmp.mpfr_set_ui(a, n, gmp.MPFR_RNDN) else: assert isinstance(n, long) tmp_mpz = ffi.new('mpz_t') gmp.mpz_init(tmp_mpz) _pylong_to_mpz(n, tmp_mpz) gmp.mpfr_set_z(a, tmp_mpz, gmp.MPFR_RNDN) gmp.mpz_clear(tmp_mpz)
def __init__(self, *args): nargs = len(args) # if nargs == 1 and isinstance(args[0], self.__class__): # self._mpc = args[0]._mpc # return if nargs == 0: self._mpc = ffi.gc(_new_mpc(), _del_mpc) gmp.mpc_set_ui(self._mpc, 0, gmp.MPC_RNDNN) elif isinstance(args[0], str): # unicode? # First argument is a string if nargs == 1: prec, base = 0, 10 elif nargs == 2: prec, base = args[1], 10 elif nargs == 3: prec, base = args[1], args[2] else: raise TypeError("function takes at most 3 arguments (4 given)") prec = _check_prec(prec) self._mpc = ffi.gc(_new_mpc(prec), _del_mpc) _str_to_mpc(args[0], base, self._mpc) elif isinstance(args[0], (mpc, complex)): # First argument is complex if nargs == 1: prec = (0, 0) elif nargs == 2: prec = _check_prec(args[1]) else: raise TypeError("function takes at most 2 arguments (3 given)") self._mpc = ffi.gc(_new_mpc(prec), _del_mpc) if isinstance(args[0], mpc): gmp.mpc_set(self._mpc, args[0]._mpc, gmp.MPC_RNDNN) elif isinstance(args[0], complex): gmp.mpc_set_d_d(self._mpc, args[0].real, args[0].imag, gmp.MPC_RNDNN) elif isinstance(args[0], (mpfr, mpq, mpz, float, int, long)): # First argument is real if nargs <= 2: prec = (0, 0) elif nargs == 3: prec = _check_prec(args[2]) else: raise TypeError("function takes at most 3 arguments (4 given)") self._mpc = ffi.gc(_new_mpc(prec), _del_mpc) realref = gmp.mpc_realref(self._mpc) imagref = gmp.mpc_imagref(self._mpc) if isinstance(args[0], mpfr): gmp.mpfr_set(realref, args[0]._mpfr, gmp.MPFR_RNDN) elif isinstance(args[0], mpz): gmp.mpfr_set_z(realref, args[0]._mpz, gmp.MPFR_RNDN) elif isinstance(args[0], mpq): gmp.mpfr_set_q(realref, args[0]._mpq, gmp.MPFR_RNDN) elif isinstance(args[0], float): gmp.mpfr_set_d(realref, args[0], gmp.MPFR_RNDN) elif isinstance(args[0], (int, long)): _pyint_to_mpfr(args[0], realref) if nargs >= 2: # Check if second argument is real if isinstance(args[1], mpfr): gmp.mpfr_set(imagref, args[1]._mpfr, gmp.MPFR_RNDN) elif isinstance(args[1], mpz): gmp.mpfr_set_z(imagref, args[1]._mpz, gmp.MPFR_RNDN) elif isinstance(args[1], mpq): gmp.mpfr_set_q(imagref, args[1]._mpq, gmp.MPFR_RNDN) elif isinstance(args[1], float): gmp.mpfr_set_d(imagref, args[1], gmp.MPFR_RNDN) elif isinstance(args[1], (int, long)): _pyint_to_mpfr(args[1], imagref) else: raise TypeError( "invalid type for imaginary component in mpc()") else: gmp.mpfr_set_ui(imagref, 0, gmp.MPFR_RNDN) else: raise TypeError("mpc() requires numeric or string argument")
def __init__(self, *args): nargs = len(args) # if nargs == 1 and isinstance(args[0], self.__class__): # self._mpc = args[0]._mpc # return if nargs == 0: self._mpc = ffi.gc(_new_mpc(), _del_mpc) gmp.mpc_set_ui(self._mpc, 0, gmp.MPC_RNDNN) elif isinstance(args[0], str): # unicode? # First argument is a string if nargs == 1: prec, base = 0, 10 elif nargs == 2: prec, base = args[1], 10 elif nargs == 3: prec, base = args[1], args[2] else: raise TypeError("function takes at most 3 arguments (4 given)") prec = _check_prec(prec) self._mpc = ffi.gc(_new_mpc(prec), _del_mpc) _str_to_mpc(args[0], base, self._mpc) elif isinstance(args[0], (mpc, complex)): # First argument is complex if nargs == 1: prec = (0, 0) elif nargs == 2: prec = _check_prec(args[1]) else: raise TypeError("function takes at most 2 arguments (3 given)") self._mpc = ffi.gc(_new_mpc(prec), _del_mpc) if isinstance(args[0], mpc): gmp.mpc_set(self._mpc, args[0]._mpc, gmp.MPC_RNDNN) elif isinstance(args[0], complex): gmp.mpc_set_d_d(self._mpc, args[0].real, args[0].imag, gmp.MPC_RNDNN) elif isinstance(args[0], (mpfr, mpq, mpz, float, int, long)): # First argument is real if nargs <= 2: prec = (0, 0) elif nargs == 3: prec = _check_prec(args[2]) else: raise TypeError("function takes at most 3 arguments (4 given)") self._mpc = ffi.gc(_new_mpc(prec), _del_mpc) realref = gmp.mpc_realref(self._mpc) imagref = gmp.mpc_imagref(self._mpc) if isinstance(args[0], mpfr): gmp.mpfr_set(realref, args[0]._mpfr, gmp.MPFR_RNDN) elif isinstance(args[0], mpz): gmp.mpfr_set_z(realref, args[0]._mpz, gmp.MPFR_RNDN) elif isinstance(args[0], mpq): gmp.mpfr_set_q(realref, args[0]._mpq, gmp.MPFR_RNDN) elif isinstance(args[0], float): gmp.mpfr_set_d(realref, args[0], gmp.MPFR_RNDN) elif isinstance(args[0], (int, long)): _pyint_to_mpfr(args[0], realref) if nargs >= 2: # Check if second argument is real if isinstance(args[1], mpfr): gmp.mpfr_set(imagref, args[1]._mpfr, gmp.MPFR_RNDN) elif isinstance(args[1], mpz): gmp.mpfr_set_z(imagref, args[1]._mpz, gmp.MPFR_RNDN) elif isinstance(args[1], mpq): gmp.mpfr_set_q(imagref, args[1]._mpq, gmp.MPFR_RNDN) elif isinstance(args[1], float): gmp.mpfr_set_d(imagref, args[1], gmp.MPFR_RNDN) elif isinstance(args[1], (int, long)): _pyint_to_mpfr(args[1], imagref) else: raise TypeError("invalid type for imaginary component in mpc()") else: gmp.mpfr_set_ui(imagref, 0, gmp.MPFR_RNDN) else: raise TypeError("mpc() requires numeric or string argument")