void mpfr_taylor_nat_log(mpfr_t R, mpfr_t x, mpz_t n) { assert(mpz_cmp_ui(n, 0) > 0); assert(mpfr_cmp_ui(x, 0) > 0); mpfr_t a, t, tt; mpfr_exp_t b; mpz_t k; unsigned int f = 1000, F = 1000; mpfr_init(a); mpfr_frexp(&b, a, x, MPFR_RNDN); mpfr_ui_sub(a, 1, a, MPFR_RNDN); mpfr_init_set(t, a, MPFR_RNDN); mpfr_init(tt); mpfr_set(R, a, MPFR_RNDN); for(mpz_init_set_ui(k, 2); mpz_cmp(k, n) < 0; mpz_add_ui(k, k, 1)) { mpfr_mul(t, t, a, MPFR_RNDN); mpfr_div_z(tt, t, k, MPFR_RNDN); mpfr_add(R, R, tt, MPFR_RNDN); } mpfr_mul_si(a, MPFR_NAT_LOG_2, b, MPFR_RNDN); mpfr_sub(R, a, R, MPFR_RNDN); }
static PyObject * GMPy_Real_Frexp(PyObject *x, CTXT_Object *context) { PyObject *result; MPFR_Object *value, *tempx; mpfr_exp_t exp = 0; CHECK_CONTEXT(context); value = GMPy_MPFR_New(0, context); tempx = GMPy_MPFR_From_Real(x, 1, context); result = PyTuple_New(2); if (!value || !result || !tempx) { Py_XDECREF((PyObject*)tempx); Py_XDECREF((PyObject*)value); Py_XDECREF(result); return NULL; } mpfr_clear_flags(); value->rc = mpfr_frexp(&exp, value->f, tempx->f, GET_MPFR_ROUND(context)); Py_DECREF((PyObject*)tempx); _GMPy_MPFR_Cleanup(&value, context); PyTuple_SET_ITEM(result, 0, PyIntOrLong_FromSsize_t((Py_ssize_t)exp)); PyTuple_SET_ITEM(result, 1, (PyObject*)value); return result; }
void mpfr_bisect_sqrt(mpfr_t R, mpfr_t N, mpfr_t T) { if(mpfr_cmp_ui(N, 0) < 0) { fprintf(stderr, "The value to square root must be non-negative\n"); exit(-1); } if(mpfr_cmp_ui(T, 0) < 0) { fprintf(stderr, "The tolerance must be non-negative\n"); exit(-1); } mpfr_exp_t e; mpfr_t a, b, x, f, d, fab, n; mpfr_init(n); mpfr_frexp(&e, n, N, MPFR_RNDN); if(e%2) { mpfr_div_ui(n, n, 2, MPFR_RNDN); e += 1; } //Set a == 0 mpfr_init_set_ui(a, 0, MPFR_RNDN); //Set b == 1 mpfr_init_set_ui(b, 1, MPFR_RNDN); //Set x = (a + b)/2 mpfr_init(x); mpfr_add(x, a, b, MPFR_RNDN); mpfr_mul(x, x, MPFR_HALF, MPFR_RNDN); //Set f = x^2 - N and fab = |f| mpfr_init(f); mpfr_init(fab); mpfr_mul(f, x, x, MPFR_RNDN); mpfr_sub(f, f, N, MPFR_RNDN); mpfr_abs(fab, f, MPFR_RNDN); //Set d = b - a mpfr_init(d); mpfr_sub(d, b, a, MPFR_RNDN); while(mpfr_cmp(fab, T) > 0 && mpfr_cmp(d, T) > 0) { //Update the bounds, a and b if(mpfr_cmp_ui(f, 0) < 0) mpfr_set(a, x, MPFR_RNDN); else mpfr_set(b, x, MPFR_RNDN); //Update x mpfr_add(x, a, b, MPFR_RNDN); mpfr_mul(x, x, MPFR_HALF, MPFR_RNDN); //Update f and fab mpfr_mul(f, x, x, MPFR_RNDN); mpfr_sub(f, f, n, MPFR_RNDN); mpfr_abs(fab, f, MPFR_RNDN); } printf("beep"); mpfr_mul_2si(R, x, e/2, MPFR_RNDN); }