diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2016-07-22 15:25:37 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2016-07-22 15:25:37 +0000 |
commit | a0013e37ddc9188738dc881a58ea26b637e72318 (patch) | |
tree | 29c5148f63731b2fa0af74391ad3bb3c709521b0 /tests/tadd.c | |
parent | fa06e09eddd04e5c23a47b10b7add0c09093e576 (diff) | |
download | mpfr-a0013e37ddc9188738dc881a58ea26b637e72318.tar.gz |
Merged r10657 from the trunk, resolving the conflict (same code as
in the trunk, except RND_RAND changed to RND_RAND_NO_RNDF).
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/branches/faithful@10658 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'tests/tadd.c')
-rw-r--r-- | tests/tadd.c | 92 |
1 files changed, 50 insertions, 42 deletions
diff --git a/tests/tadd.c b/tests/tadd.c index d4bae55ee..e2e3e04e4 100644 --- a/tests/tadd.c +++ b/tests/tadd.c @@ -477,9 +477,11 @@ check_inexact (void) mpfr_set_prec (u, 33); mpfr_set_str_binary (u, "0.101110100101101100000000111100000E-1"); mpfr_set_prec (y, 31); - if ((inexact = test_add (y, x, u, MPFR_RNDN))) + inexact = test_add (y, x, u, MPFR_RNDN); + + if (inexact != 0) { - printf ("Wrong inexact flag (2): expected 0, got %d\n", inexact); + printf ("Wrong ternary value (2): expected 0, got %d\n", inexact); exit (1); } @@ -488,64 +490,70 @@ check_inexact (void) mpfr_set_prec (u, 33); mpfr_set_str_binary (u, "0.101110100101101100000000111100000E-1"); mpfr_set_prec (y, 28); - if ((inexact = test_add (y, x, u, MPFR_RNDN))) + inexact = test_add (y, x, u, MPFR_RNDN); + + if (inexact != 0) { - printf ("Wrong inexact flag (1): expected 0, got %d\n", inexact); + printf ("Wrong ternary value (1): expected 0, got %d\n", inexact); exit (1); } - for (px=2; px<MAX_PREC; px++) + for (px = 2; px < MAX_PREC; px++) { mpfr_set_prec (x, px); + do { mpfr_urandomb (x, RANDS); } while (mpfr_cmp_ui (x, 0) == 0); - for (pu=2; pu<MAX_PREC; pu++) + + for (pu = 2; pu < MAX_PREC; pu++) { mpfr_set_prec (u, pu); + do { mpfr_urandomb (u, RANDS); } while (mpfr_cmp_ui (u, 0) == 0); - { - py = MPFR_PREC_MIN + (randlimb () % (MAX_PREC - 1)); - mpfr_set_prec (y, py); - pz = (mpfr_cmpabs (x, u) >= 0) ? MPFR_EXP(x) - MPFR_EXP(u) - : MPFR_EXP(u) - MPFR_EXP(x); - /* x + u is exactly representable with precision - abs(EXP(x)-EXP(u)) + max(prec(x), prec(u)) + 1 */ - pz = pz + MAX(MPFR_PREC(x), MPFR_PREC(u)) + 1; - mpfr_set_prec (z, pz); - rnd = RND_RAND_NO_RNDF (); - if (test_add (z, x, u, rnd)) - { - printf ("z <- x + u should be exact\n"); - printf ("x="); mpfr_dump (x); - printf ("u="); mpfr_dump (u); - printf ("z="); mpfr_dump (z); - exit (1); - } - { - rnd = RND_RAND_NO_RNDF (); - inexact = test_add (y, x, u, rnd); - cmp = mpfr_cmp (y, z); - if (((inexact == 0) && (cmp != 0)) || - ((inexact > 0) && (cmp <= 0)) || - ((inexact < 0) && (cmp >= 0))) - { - printf ("Wrong inexact flag for rnd=%s\n", - mpfr_print_rnd_mode(rnd)); - printf ("expected %d, got %d\n", cmp, inexact); - printf ("x="); mpfr_dump (x); - printf ("u="); mpfr_dump (u); - printf ("y= "); mpfr_dump (y); - printf ("x+u="); mpfr_dump (z); - exit (1); - } - } + + py = MPFR_PREC_MIN + (randlimb () % (MAX_PREC - 1)); + mpfr_set_prec (y, py); + pz = mpfr_cmpabs (x, u) >= 0 ? + MPFR_EXP(x) - MPFR_EXP(u) : + MPFR_EXP(u) - MPFR_EXP(x); + /* x + u is exactly representable with precision + abs(EXP(x)-EXP(u)) + max(prec(x), prec(u)) + 1 */ + pz = pz + MAX(MPFR_PREC(x), MPFR_PREC(u)) + 1; + mpfr_set_prec (z, pz); + + rnd = RND_RAND_NO_RNDF (); + inexact = test_add (z, x, u, rnd); + if (inexact != 0) + { + printf ("z <- x + u should be exact\n"); + printf ("x="); mpfr_dump (x); + printf ("u="); mpfr_dump (u); + printf ("z="); mpfr_dump (z); + exit (1); + } + + rnd = RND_RAND_NO_RNDF (); + inexact = test_add (y, x, u, rnd); + cmp = mpfr_cmp (y, z); + if ((inexact == 0 && cmp != 0) || + (inexact > 0 && cmp <= 0) || + (inexact < 0 && cmp >= 0)) + { + printf ("Wrong ternary value for rnd=%s\n", + mpfr_print_rnd_mode (rnd)); + printf ("expected %d, got %d\n", cmp, inexact); + printf ("x="); mpfr_dump (x); + printf ("u="); mpfr_dump (u); + printf ("y= "); mpfr_dump (y); + printf ("x+u="); mpfr_dump (z); + exit (1); } } } |