summaryrefslogtreecommitdiff
path: root/tests/tadd.c
diff options
context:
space:
mode:
authorzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2016-07-06 14:07:34 +0000
committerzimmerma <zimmerma@280ebfd0-de03-0410-8827-d642c229c3f4>2016-07-06 14:07:34 +0000
commit152eb16de2532b7ae354676e42f4deefda2086bc (patch)
tree49a7e007e9592945d99a6283064b52d522abf1c0 /tests/tadd.c
parentdee4cb766caf1ca98fca6dda0c53711beb21911b (diff)
downloadmpfr-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.c31
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);
}