示例#1
0
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);
}
示例#2
0
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;
}
示例#3
0
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);
}