summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2015-06-12 13:55:51 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2015-06-12 13:55:51 +0000
commit591ced6470b9120e6a63be298e06f2a34839765e (patch)
tree394b9bfb78991741f0c99b3c854d05ae77a9ce3f
parent6a2da610b91aa35bc66c8fc5f6206910c33bc02b (diff)
downloadmpfr-591ced6470b9120e6a63be298e06f2a34839765e.tar.gz
[tests/tfma.c] Improved the new underflow tests (test_underflow3) to
test FMA(-x,y,-z). git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@9572 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r--tests/tfma.c81
1 files changed, 42 insertions, 39 deletions
diff --git a/tests/tfma.c b/tests/tfma.c
index 5579a5292..b3028e037 100644
--- a/tests/tfma.c
+++ b/tests/tfma.c
@@ -339,7 +339,7 @@ static void
test_underflow3 (int n)
{
mpfr_t x, y, z, t1, t2;
- int k, s, rnd, inex1, inex2;
+ int sign, k, s, rnd, inex1, inex2;
mpfr_exp_t e;
mpfr_flags_t flags1, flags2;
@@ -348,47 +348,50 @@ test_underflow3 (int n)
e = mpfr_get_emin () - 1;
- for (k = 1; k <= 7; k++)
- for (s = -1; s <= 1; s++)
- {
- mpfr_set_si_2exp (x, 1, e, MPFR_RNDN);
- mpfr_set_si_2exp (y, 8*k+s, -6, MPFR_RNDN);
- mpfr_neg (z, x, MPFR_RNDN);
- /* x = 2^(emin-1)
- y = (8 * k + s) * 2^(-6) = k / 8 + s * 2^(-6)
- z = -2^(emin-1)
- FMA(x,y,z) = (k-8) * 2^(emin-4) + s * 2^(emin-7) exactly.
- Note: The purpose of the s * 2^(emin-7) term is to yield
- double rounding when scaling for k = 4, s != 0, MPFR_RNDN. */
+ for (sign = 1; sign >= -1; sign -= 2)
+ for (k = 1; k <= 7; k++)
+ for (s = -1; s <= 1; s++)
+ {
+ mpfr_set_si_2exp (x, sign, e, MPFR_RNDN);
+ mpfr_set_si_2exp (y, 8*k+s, -6, MPFR_RNDN);
+ mpfr_neg (z, x, MPFR_RNDN);
+ /* x = sign * 2^(emin-1)
+ y = (8 * k + s) * 2^(-6) = k / 8 + s * 2^(-6)
+ z = -x = -sign * 2^(emin-1)
+ FMA(x,y,z) = sign * ((k-8) * 2^(emin-4) + s * 2^(emin-7)) exactly.
+ Note: The purpose of the s * 2^(emin-7) term is to yield
+ double rounding when scaling for k = 4, s != 0, MPFR_RNDN. */
- RND_LOOP (rnd)
- {
- mpfr_clear_flags ();
- inex1 = mpfr_set_si_2exp (t1, 8*k+s-64, e-6, (mpfr_rnd_t) rnd);
- flags1 = __gmpfr_flags;
+ RND_LOOP (rnd)
+ {
+ mpfr_clear_flags ();
+ inex1 = mpfr_set_si_2exp (t1, sign * (8*k+s-64), e-6,
+ (mpfr_rnd_t) rnd);
+ flags1 = __gmpfr_flags;
- mpfr_clear_flags ();
- inex2 = mpfr_fma (t2, x, y, z, (mpfr_rnd_t) rnd);
- flags2 = __gmpfr_flags;
+ mpfr_clear_flags ();
+ inex2 = mpfr_fma (t2, x, y, z, (mpfr_rnd_t) rnd);
+ flags2 = __gmpfr_flags;
- if (! (mpfr_equal_p (t1, t2) &&
- SAME_SIGN (inex1, inex2) &&
- flags1 == flags2))
- {
- printf ("Error in test_underflow3, n = %d, k = %d, s = %d, %s"
- "\n", n, k, s, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
- printf ("Expected ");
- mpfr_dump (t1);
- printf (" with inex ~ %d, flags =", inex1);
- flags_out (flags1);
- printf ("Got ");
- mpfr_dump (t2);
- printf (" with inex ~ %d, flags =", inex2);
- flags_out (flags2);
- exit (1);
- }
- }
- }
+ if (! (mpfr_equal_p (t1, t2) &&
+ SAME_SIGN (inex1, inex2) &&
+ flags1 == flags2))
+ {
+ printf ("Error in test_underflow3, n = %d, sign = %d,"
+ " k = %d, s = %d, %s\n", n, sign, k, s,
+ mpfr_print_rnd_mode ((mpfr_rnd_t) rnd));
+ printf ("Expected ");
+ mpfr_dump (t1);
+ printf (" with inex ~ %d, flags =", inex1);
+ flags_out (flags1);
+ printf ("Got ");
+ mpfr_dump (t2);
+ printf (" with inex ~ %d, flags =", inex2);
+ flags_out (flags2);
+ exit (1);
+ }
+ }
+ }
mpfr_clears (x, y, z, t1, t2, (mpfr_ptr) 0);
}