Beispiel #1
0
def _init_mpc_cache():
    global mpc_cache, in_mpc_cache
    mpc_cache = []
    in_mpc_cache = cache_size
    for _ in xrange(cache_size):
        mpc = ffi.new("mpc_t")
        gmp.mpc_init2(mpc, gmp.mpfr_get_default_prec())
        mpc_cache.append(mpc)
Beispiel #2
0
def _new_mpc(prec=(0,0)):
    """Return an initialized mpc_t."""
    global in_mpc_cache

    # prec is assumed to be checked already
    rprec, iprec = prec

    if not all(p == 0 or gmp.MPFR_PREC_MIN <= p <= gmp.MPFR_PREC_MAX
               for p in prec):
            raise ValueError(
                "invalid prec (wanted prec == 0 or %s <= prec <= %s)" % (
                    gmp.MPFR_PREC_MIN, gmp.MPFR_PREC_MAX))

    if in_mpc_cache:
        in_mpc_cache -= 1
        # Set default precision
        if rprec == iprec:
            if rprec  == 0:
                gmp.mpc_set_prec(mpc_cache[in_mpc_cache], gmp.mpfr_get_default_prec())
            else:
                gmp.mpc_set_prec(mpc_cache[in_mpc_cache], rprec)
        else:
            if rprec == 0:
                rprec = gmp.mpfr_get_default_prec()
            if iprec == 0:
                iprec = gmp.mpfr_get_default_prec()
            gmp.mpc_clear(mpc_cache[in_mpc_cache])
            gmp.mpc_init3(mpc_cache[in_mpc_cache], rprec, iprec)
        return mpc_cache[in_mpc_cache]
    else:
        mpc = ffi.new("mpc_t")
        if rprec == 0:
            rprec = gmp.mpfr_get_default_prec()
        if iprec == 0:
            iprec = gmp.mpfr_get_default_prec()
        if rprec == iprec:
            gmp.mpc_init2(mpc, rprec)
        else:
            gmp.mpc_init3(mpc, rprec, iprec)
        return mpc