summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2008-07-25 13:28:17 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2008-07-25 13:28:17 +0000
commite761ffcc556037b86308e069b50bda9dbb0c997c (patch)
tree1a62076ac2f137c2edebd91c684d97fe41f0b663
parent22de028b62905fa5293fbb208e91098403fbfe77 (diff)
downloadmpfr-e761ffcc556037b86308e069b50bda9dbb0c997c.tar.gz
tests/tpow_all.c:
* cmpres argument z1 can now be a null pointer; * documented the arguments of cmpres; * completed underflow_up1 test. git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/branches/vlefevre@5448 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r--tests/tpow_all.c70
1 files changed, 62 insertions, 8 deletions
diff --git a/tests/tpow_all.c b/tests/tpow_all.c
index 8da8e77d2..c755aba23 100644
--- a/tests/tpow_all.c
+++ b/tests/tpow_all.c
@@ -58,6 +58,18 @@ err (const char *s, int i, int j, int rnd, mpfr_srcptr z, int inex)
exit (1);
}
+/* Arguments:
+ * spx: non-zero if px is a stringm zero if px is a MPFR number.
+ * px: value of x (string or MPFR number).
+ * sy: value of y (string).
+ * rnd: rounding mode.
+ * z1: expected result (null pointer if unknown pure FP value).
+ * inex1: expected ternary value (if z1 is not a null pointer).
+ * z2: computed result.
+ * inex2: computed ternary value.
+ * flags1: expected flags (computed flags in __gmpfr_flags).
+ * s: string about the context.
+ */
static void
cmpres (int spx, const void *px, const char *sy, mp_rnd_t rnd,
mpfr_srcptr z1, int inex1, mpfr_srcptr z2, int inex2,
@@ -67,9 +79,14 @@ cmpres (int spx, const void *px, const char *sy, mp_rnd_t rnd,
if (flags1 == flags2)
{
- if (MPFR_IS_NAN (z1) && MPFR_IS_NAN (z2))
- return;
- if (mpfr_equal_p (z1, z2) && SAME_SIGN (inex1, inex2))
+ if (z1 == NULL)
+ {
+ if (MPFR_IS_PURE_FP (z2))
+ return;
+ }
+ else if (SAME_SIGN (inex1, inex2) &&
+ ((MPFR_IS_NAN (z1) && MPFR_IS_NAN (z2)) ||
+ mpfr_equal_p (z1, z2)))
return;
}
@@ -83,8 +100,15 @@ cmpres (int spx, const void *px, const char *sy, mp_rnd_t rnd,
}
printf ("y = %s, %s\n", sy, mpfr_print_rnd_mode (rnd));
printf ("Expected ");
- mpfr_out_str (stdout, 16, 0, z1, GMP_RNDN);
- printf (", inex = %d, flags = %u\n", SIGN (inex1), flags1);
+ if (z1 == NULL)
+ {
+ printf ("pure FP value, flags = %u\n", flags1);
+ }
+ else
+ {
+ mpfr_out_str (stdout, 16, 0, z1, GMP_RNDN);
+ printf (", inex = %d, flags = %u\n", SIGN (inex1), flags1);
+ }
printf ("Got ");
mpfr_out_str (stdout, 16, 0, z2, GMP_RNDN);
printf (", inex = %d, flags = %u\n", SIGN (inex2), flags2);
@@ -345,9 +369,10 @@ tst (void)
static void
underflow_up1 (int extended_emin)
{
- mpfr_t delta, x, y, z;
+ mpfr_t delta, x, y, z, z0;
mp_exp_t n;
int inex;
+ int rnd;
int i;
n = mpfr_get_emin ();
@@ -366,20 +391,49 @@ underflow_up1 (int extended_emin)
inex = mpfr_set_si (y, n, GMP_RNDN);
MPFR_ASSERTN (inex == 0);
+ mpfr_init2 (z0, 2);
+ mpfr_set_ui (z0, 0, GMP_RNDN);
+
mpfr_init2 (z, 32);
for (i = 0; i <= 12; i++)
{
+ unsigned int flags = 0;
+ char sy[16];
+
/* Test 2^(emin - i/4).
* --> Underflow iff i > 4.
- * --> Zero iff i >= 8.
+ * --> Zero in GMP_RNDN iff i >= 8.
*/
+ if (i != 0 && i != 4)
+ flags |= MPFR_FLAGS_INEXACT;
+ if (i > 4)
+ flags |= MPFR_FLAGS_UNDERFLOW;
+
+ sprintf (sy, "emin - %d/4", i);
+
+ RND_LOOP (rnd)
+ {
+ int zero;
+
+ zero = (i > 4 && (rnd == GMP_RNDZ || rnd == GMP_RNDD)) ||
+ (i >= 8 && rnd == GMP_RNDN);
+
+ mpfr_clear_flags ();
+ inex = mpfr_pow (z, x, y, (mp_rnd_t) rnd);
+ cmpres (1, "2", sy, (mp_rnd_t) rnd,
+ zero ? z0 : (mpfr_ptr) NULL, -1, z, inex, flags,
+ extended_emin ? "underflow_up1 and extended emin" :
+ "underflow_up1");
+ test_others ("2", sy, (mp_rnd_t) rnd, x, y, z, inex, flags);
+ }
+
inex = mpfr_sub (y, y, delta, GMP_RNDN);
MPFR_ASSERTN (inex == 0);
}
- mpfr_clears (delta, x, y, z, (mpfr_ptr) 0);
+ mpfr_clears (delta, x, y, z, z0, (mpfr_ptr) 0);
}
static void