new implementation of arb_exp(), part 2

This commit is contained in:
Fredrik Johansson 2014-09-19 16:39:30 +02:00
parent b7874d48de
commit 855389cdde
3 changed files with 51 additions and 38 deletions

View file

@ -45,23 +45,3 @@ void arb_root(arb_t z, const arb_t x, ulong k, long prec)
fmprb_clear(t);
}
void arb_exp(arb_t z, const arb_t x, long prec)
{
fmprb_t t;
fmprb_init(t);
arb_get_fmprb(t, x);
fmprb_exp(t, t, prec);
arb_set_fmprb(z, t);
fmprb_clear(t);
}
void arb_expm1(arb_t z, const arb_t x, long prec)
{
fmprb_t t;
fmprb_init(t);
arb_get_fmprb(t, x);
fmprb_expm1(t, t, prec);
arb_set_fmprb(z, t);
fmprb_clear(t);
}

View file

@ -40,16 +40,22 @@ int main()
arb_t a, b;
fmpq_t q;
mpfr_t t;
long prec = 2 + n_randint(state, 200);
long prec0, prec;
prec0 = 400;
if (iter % 100 == 0)
prec0 = 10000;
prec = 2 + n_randint(state, prec0);
arb_init(a);
arb_init(b);
fmpq_init(q);
mpfr_init2(t, prec + 100);
arb_randtest(a, state, 1 + n_randint(state, 200), 3);
arb_randtest(b, state, 1 + n_randint(state, 200), 3);
arb_get_rand_fmpq(q, state, a, 1 + n_randint(state, 200));
arb_randtest(a, state, 1 + n_randint(state, prec0), 4);
arb_randtest(b, state, 1 + n_randint(state, prec0), 4);
arb_get_rand_fmpq(q, state, a, 1 + n_randint(state, prec0));
fmpq_get_mpfr(t, q, MPFR_RNDN);
mpfr_exp(t, t, MPFR_RNDN);
@ -59,6 +65,7 @@ int main()
if (!arb_contains_mpfr(b, t))
{
printf("FAIL: containment\n\n");
printf("iter = %ld, prec = %ld\n\n", iter, prec);
printf("a = "); arb_print(a); printf("\n\n");
printf("b = "); arb_print(b); printf("\n\n");
abort();
@ -69,6 +76,9 @@ int main()
if (!arb_equal(a, b))
{
printf("FAIL: aliasing\n\n");
printf("iter = %ld, prec = %ld\n\n", iter, prec);
printf("a = "); arb_print(a); printf("\n\n");
printf("b = "); arb_print(b); printf("\n\n");
abort();
}
@ -82,17 +92,23 @@ int main()
for (iter = 0; iter < 100000; iter++)
{
arb_t a, b, c, d;
long prec1, prec2;
long prec0, prec1, prec2;
prec1 = 2 + n_randint(state, 1000);
prec2 = prec1 + 30;
if (iter % 10 == 0)
prec0 = 10000;
else
prec0 = 1000;
prec1 = 2 + n_randint(state, prec0);
prec2 = 2 + n_randint(state, prec0);
arb_init(a);
arb_init(b);
arb_init(c);
arb_init(d);
arb_randtest_precise(a, state, 1 + n_randint(state, 1000), 100);
arb_randtest_special(a, state, 1 + n_randint(state, prec0), 100);
arb_randtest_special(b, state, 1 + n_randint(state, prec0), 100);
arb_exp(b, a, prec1);
arb_exp(c, a, prec2);
@ -106,7 +122,7 @@ int main()
abort();
}
arb_randtest_precise(b, state, 1 + n_randint(state, 1000), 100);
arb_randtest_special(b, state, 1 + n_randint(state, prec0), 100);
/* check exp(a)*exp(b) = exp(a+b) */
arb_exp(c, a, prec1);
@ -137,3 +153,4 @@ int main()
printf("PASS\n");
return EXIT_SUCCESS;
}

View file

@ -40,16 +40,22 @@ int main()
arb_t a, b;
fmpq_t q;
mpfr_t t;
long prec = 2 + n_randint(state, 200);
long prec0, prec;
prec0 = 400;
if (iter % 100 == 0)
prec0 = 10000;
prec = 2 + n_randint(state, prec0);
arb_init(a);
arb_init(b);
fmpq_init(q);
mpfr_init2(t, prec + 100);
arb_randtest(a, state, 1 + n_randint(state, 200), 3);
arb_randtest(b, state, 1 + n_randint(state, 200), 3);
arb_get_rand_fmpq(q, state, a, 1 + n_randint(state, 200));
arb_randtest(a, state, 1 + n_randint(state, prec0), 4);
arb_randtest(b, state, 1 + n_randint(state, prec0), 4);
arb_get_rand_fmpq(q, state, a, 1 + n_randint(state, prec0));
fmpq_get_mpfr(t, q, MPFR_RNDN);
mpfr_expm1(t, t, MPFR_RNDN);
@ -59,6 +65,7 @@ int main()
if (!arb_contains_mpfr(b, t))
{
printf("FAIL: containment\n\n");
printf("iter = %ld, prec = %ld\n\n", iter, prec);
printf("a = "); arb_print(a); printf("\n\n");
printf("b = "); arb_print(b); printf("\n\n");
abort();
@ -69,6 +76,9 @@ int main()
if (!arb_equal(a, b))
{
printf("FAIL: aliasing\n\n");
printf("iter = %ld, prec = %ld\n\n", iter, prec);
printf("a = "); arb_print(a); printf("\n\n");
printf("b = "); arb_print(b); printf("\n\n");
abort();
}
@ -82,17 +92,23 @@ int main()
for (iter = 0; iter < 100000; iter++)
{
arb_t a, b, c, d;
long prec1, prec2;
long prec0, prec1, prec2;
prec1 = 2 + n_randint(state, 1000);
prec2 = prec1 + 30;
if (iter % 10 == 0)
prec0 = 10000;
else
prec0 = 1000;
prec1 = 2 + n_randint(state, prec0);
prec2 = 2 + n_randint(state, prec0);
arb_init(a);
arb_init(b);
arb_init(c);
arb_init(d);
arb_randtest_precise(a, state, 1 + n_randint(state, 1000), 100);
arb_randtest_special(a, state, 1 + n_randint(state, prec0), 100);
arb_randtest_special(b, state, 1 + n_randint(state, prec0), 100);
arb_expm1(b, a, prec1);
arb_expm1(c, a, prec2);
@ -106,7 +122,7 @@ int main()
abort();
}
arb_randtest_precise(b, state, 1 + n_randint(state, 1000), 100);
arb_randtest_special(b, state, 1 + n_randint(state, prec0), 100);
/* compare with exp */
arb_expm1(c, a, prec1);