示例#1
0
    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])
示例#2
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)
示例#3
0
 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)
示例#4
0
 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)
示例#5
0
 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
示例#6
0
 def __abs__(self):
     res = _new_mpfr()
     gmp.mpfr_abs(res, self._mpfr, gmp.MPFR_RNDN)
     return mpfr._from_c_mpfr(res)
示例#7
0
 def __abs__(self):
     res = _new_mpfr()
     gmp.mpc_abs(res, self._mpc, gmp.MPC_RNDNN)
     return mpfr._from_c_mpfr(res)
示例#8
0
 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
示例#9
0
文件: mpc.py 项目: sn6uv/gmpy_cffi
 def __abs__(self):
     res = _new_mpfr()
     gmp.mpc_abs(res, self._mpc, gmp.MPC_RNDNN)
     return mpfr._from_c_mpfr(res)
示例#10
0
文件: mpc.py 项目: sn6uv/gmpy_cffi
 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