diff options
author | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2016-07-06 14:07:34 +0000 |
---|---|---|
committer | zimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4> | 2016-07-06 14:07:34 +0000 |
commit | 152eb16de2532b7ae354676e42f4deefda2086bc (patch) | |
tree | 49a7e007e9592945d99a6283064b52d522abf1c0 /tests/tadd.c | |
parent | dee4cb766caf1ca98fca6dda0c53711beb21911b (diff) | |
download | mpfr-152eb16de2532b7ae354676e42f4deefda2086bc.tar.gz |
[tests/tadd.c] last commit was wrong
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@10583 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'tests/tadd.c')
-rw-r--r-- | tests/tadd.c | 31 |
1 files changed, 20 insertions, 11 deletions
diff --git a/tests/tadd.c b/tests/tadd.c index 4e3cbb780..00f255007 100644 --- a/tests/tadd.c +++ b/tests/tadd.c @@ -624,25 +624,31 @@ check_overflow (void) { mpfr_t a, b, c; mpfr_prec_t prec_a, prec_b, prec_c; - int r; + int r, up; mpfr_init (a); mpfr_init (b); mpfr_init (c); RND_LOOP(r) - for (prec_a = MPFR_PREC_MIN; prec_a <= 128; prec_a++) - for (prec_b = MPFR_PREC_MIN; prec_b <= 128; prec_b++) - for (prec_c = MPFR_PREC_MIN; prec_c <= 128; prec_c++) + for (prec_a = 2; prec_a <= 128; prec_a += 2) + for (prec_b = 2; prec_b <= 128; prec_b += 2) + for (prec_c = 2; prec_c <= 128; prec_c += 2) { + mpfr_set_prec (a, prec_a); mpfr_set_prec (b, prec_b); + mpfr_set_prec (c, prec_c); + mpfr_setmax (b, mpfr_get_emax ()); + up = r == MPFR_RNDA || r == MPFR_RNDU || r == MPFR_RNDN; + /* set c with overlap with bits of b: will always overflow */ - mpfr_set_prec (c, prec_c); mpfr_set_ui_2exp (c, 1, mpfr_get_emax () - prec_b / 2, MPFR_RNDN); mpfr_nextbelow (c); - if (!mpfr_overflow_p ()) + mpfr_clear_overflow (); + mpfr_add (a, b, c, (mpfr_rnd_t) r); + if (!mpfr_overflow_p () || (up && !mpfr_inf_p (a))) { printf ("No overflow (1) in check_overflow for rnd=%s\n", mpfr_print_rnd_mode (r)); @@ -652,18 +658,17 @@ check_overflow (void) exit (1); } - if (r == MPFR_RNDZ || r == MPFR_RNDD) + if (r == MPFR_RNDZ || r == MPFR_RNDD || prec_a >= prec_b + prec_c) continue; /* set c to 111...111 so that ufp(c) = 1/2 ulp(b): will only overflow when prec_a < prec_b + prec_c, and rounding up or to nearest */ mpfr_set_ui_2exp (c, 1, mpfr_get_emax () - prec_b, MPFR_RNDN); mpfr_nextbelow (c); - mpfr_set_prec (a, prec_a); mpfr_clear_overflow (); mpfr_add (a, b, c, (mpfr_rnd_t) r); /* b + c is exactly representable iff prec_a >= prec_b + prec_c */ - if (!mpfr_overflow_p () && prec_a < prec_b + prec_c) + if (!mpfr_overflow_p () || !mpfr_inf_p (a)) { printf ("No overflow (2) in check_overflow for rnd=%s\n", mpfr_print_rnd_mode (r)); @@ -677,13 +682,17 @@ check_overflow (void) mpfr_set_prec (b, 256); mpfr_setmax (b, mpfr_get_emax ()); mpfr_set_prec (c, 256); + mpfr_set_ui (c, 1, MPFR_RNDN); mpfr_set_exp (c, mpfr_get_emax () - 512); mpfr_set_prec (a, 256); mpfr_clear_overflow (); - test_add (a, b, c, MPFR_RNDU); + mpfr_add (a, b, c, MPFR_RNDU); if (!mpfr_overflow_p ()) { - printf ("No overflow in check_overflow\n"); + printf ("No overflow (3) in check_overflow\n"); + printf ("b="); mpfr_dump (b); + printf ("c="); mpfr_dump (c); + printf ("a="); mpfr_dump (a); exit (1); } |