mirror of
https://github.com/vale981/arb
synced 2025-03-04 17:01:40 -05:00
new implementation of arb_exp(), part 2
This commit is contained in:
parent
b7874d48de
commit
855389cdde
3 changed files with 51 additions and 38 deletions
|
@ -45,23 +45,3 @@ void arb_root(arb_t z, const arb_t x, ulong k, long prec)
|
||||||
fmprb_clear(t);
|
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);
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
|
@ -40,16 +40,22 @@ int main()
|
||||||
arb_t a, b;
|
arb_t a, b;
|
||||||
fmpq_t q;
|
fmpq_t q;
|
||||||
mpfr_t t;
|
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(a);
|
||||||
arb_init(b);
|
arb_init(b);
|
||||||
fmpq_init(q);
|
fmpq_init(q);
|
||||||
mpfr_init2(t, prec + 100);
|
mpfr_init2(t, prec + 100);
|
||||||
|
|
||||||
arb_randtest(a, state, 1 + n_randint(state, 200), 3);
|
arb_randtest(a, state, 1 + n_randint(state, prec0), 4);
|
||||||
arb_randtest(b, state, 1 + n_randint(state, 200), 3);
|
arb_randtest(b, state, 1 + n_randint(state, prec0), 4);
|
||||||
arb_get_rand_fmpq(q, state, a, 1 + n_randint(state, 200));
|
arb_get_rand_fmpq(q, state, a, 1 + n_randint(state, prec0));
|
||||||
|
|
||||||
fmpq_get_mpfr(t, q, MPFR_RNDN);
|
fmpq_get_mpfr(t, q, MPFR_RNDN);
|
||||||
mpfr_exp(t, t, MPFR_RNDN);
|
mpfr_exp(t, t, MPFR_RNDN);
|
||||||
|
@ -59,6 +65,7 @@ int main()
|
||||||
if (!arb_contains_mpfr(b, t))
|
if (!arb_contains_mpfr(b, t))
|
||||||
{
|
{
|
||||||
printf("FAIL: containment\n\n");
|
printf("FAIL: containment\n\n");
|
||||||
|
printf("iter = %ld, prec = %ld\n\n", iter, prec);
|
||||||
printf("a = "); arb_print(a); printf("\n\n");
|
printf("a = "); arb_print(a); printf("\n\n");
|
||||||
printf("b = "); arb_print(b); printf("\n\n");
|
printf("b = "); arb_print(b); printf("\n\n");
|
||||||
abort();
|
abort();
|
||||||
|
@ -69,6 +76,9 @@ int main()
|
||||||
if (!arb_equal(a, b))
|
if (!arb_equal(a, b))
|
||||||
{
|
{
|
||||||
printf("FAIL: aliasing\n\n");
|
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();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,17 +92,23 @@ int main()
|
||||||
for (iter = 0; iter < 100000; iter++)
|
for (iter = 0; iter < 100000; iter++)
|
||||||
{
|
{
|
||||||
arb_t a, b, c, d;
|
arb_t a, b, c, d;
|
||||||
long prec1, prec2;
|
long prec0, prec1, prec2;
|
||||||
|
|
||||||
prec1 = 2 + n_randint(state, 1000);
|
if (iter % 10 == 0)
|
||||||
prec2 = prec1 + 30;
|
prec0 = 10000;
|
||||||
|
else
|
||||||
|
prec0 = 1000;
|
||||||
|
|
||||||
|
prec1 = 2 + n_randint(state, prec0);
|
||||||
|
prec2 = 2 + n_randint(state, prec0);
|
||||||
|
|
||||||
arb_init(a);
|
arb_init(a);
|
||||||
arb_init(b);
|
arb_init(b);
|
||||||
arb_init(c);
|
arb_init(c);
|
||||||
arb_init(d);
|
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(b, a, prec1);
|
||||||
arb_exp(c, a, prec2);
|
arb_exp(c, a, prec2);
|
||||||
|
@ -106,7 +122,7 @@ int main()
|
||||||
abort();
|
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) */
|
/* check exp(a)*exp(b) = exp(a+b) */
|
||||||
arb_exp(c, a, prec1);
|
arb_exp(c, a, prec1);
|
||||||
|
@ -137,3 +153,4 @@ int main()
|
||||||
printf("PASS\n");
|
printf("PASS\n");
|
||||||
return EXIT_SUCCESS;
|
return EXIT_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -40,16 +40,22 @@ int main()
|
||||||
arb_t a, b;
|
arb_t a, b;
|
||||||
fmpq_t q;
|
fmpq_t q;
|
||||||
mpfr_t t;
|
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(a);
|
||||||
arb_init(b);
|
arb_init(b);
|
||||||
fmpq_init(q);
|
fmpq_init(q);
|
||||||
mpfr_init2(t, prec + 100);
|
mpfr_init2(t, prec + 100);
|
||||||
|
|
||||||
arb_randtest(a, state, 1 + n_randint(state, 200), 3);
|
arb_randtest(a, state, 1 + n_randint(state, prec0), 4);
|
||||||
arb_randtest(b, state, 1 + n_randint(state, 200), 3);
|
arb_randtest(b, state, 1 + n_randint(state, prec0), 4);
|
||||||
arb_get_rand_fmpq(q, state, a, 1 + n_randint(state, 200));
|
arb_get_rand_fmpq(q, state, a, 1 + n_randint(state, prec0));
|
||||||
|
|
||||||
fmpq_get_mpfr(t, q, MPFR_RNDN);
|
fmpq_get_mpfr(t, q, MPFR_RNDN);
|
||||||
mpfr_expm1(t, t, MPFR_RNDN);
|
mpfr_expm1(t, t, MPFR_RNDN);
|
||||||
|
@ -59,6 +65,7 @@ int main()
|
||||||
if (!arb_contains_mpfr(b, t))
|
if (!arb_contains_mpfr(b, t))
|
||||||
{
|
{
|
||||||
printf("FAIL: containment\n\n");
|
printf("FAIL: containment\n\n");
|
||||||
|
printf("iter = %ld, prec = %ld\n\n", iter, prec);
|
||||||
printf("a = "); arb_print(a); printf("\n\n");
|
printf("a = "); arb_print(a); printf("\n\n");
|
||||||
printf("b = "); arb_print(b); printf("\n\n");
|
printf("b = "); arb_print(b); printf("\n\n");
|
||||||
abort();
|
abort();
|
||||||
|
@ -69,6 +76,9 @@ int main()
|
||||||
if (!arb_equal(a, b))
|
if (!arb_equal(a, b))
|
||||||
{
|
{
|
||||||
printf("FAIL: aliasing\n\n");
|
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();
|
abort();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -82,17 +92,23 @@ int main()
|
||||||
for (iter = 0; iter < 100000; iter++)
|
for (iter = 0; iter < 100000; iter++)
|
||||||
{
|
{
|
||||||
arb_t a, b, c, d;
|
arb_t a, b, c, d;
|
||||||
long prec1, prec2;
|
long prec0, prec1, prec2;
|
||||||
|
|
||||||
prec1 = 2 + n_randint(state, 1000);
|
if (iter % 10 == 0)
|
||||||
prec2 = prec1 + 30;
|
prec0 = 10000;
|
||||||
|
else
|
||||||
|
prec0 = 1000;
|
||||||
|
|
||||||
|
prec1 = 2 + n_randint(state, prec0);
|
||||||
|
prec2 = 2 + n_randint(state, prec0);
|
||||||
|
|
||||||
arb_init(a);
|
arb_init(a);
|
||||||
arb_init(b);
|
arb_init(b);
|
||||||
arb_init(c);
|
arb_init(c);
|
||||||
arb_init(d);
|
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(b, a, prec1);
|
||||||
arb_expm1(c, a, prec2);
|
arb_expm1(c, a, prec2);
|
||||||
|
@ -106,7 +122,7 @@ int main()
|
||||||
abort();
|
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 */
|
/* compare with exp */
|
||||||
arb_expm1(c, a, prec1);
|
arb_expm1(c, a, prec1);
|
||||||
|
|
Loading…
Add table
Reference in a new issue