summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2015-08-24 15:23:55 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2015-08-24 15:23:55 +0000
commit53c5c3f927121188cf8d9a0ef2a40e8cefc5ee62 (patch)
tree5b4a8dab9a38d05b3855b710d32fd60056ec2b64
parentb9716c8cd40ce733f97b5dca37d5e1e4780321af (diff)
downloadmpfr-53c5c3f927121188cf8d9a0ef2a40e8cefc5ee62.tar.gz
[tests/tfits.c] For the mpfr_fits_{u,s}{long,int,short}_p functions,
check that the flags are not modified and added tests of -Inf and -0. git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@9653 280ebfd0-de03-0410-8827-d642c229c3f4
-rw-r--r--tests/tfits.c261
1 files changed, 117 insertions, 144 deletions
diff --git a/tests/tfits.c b/tests/tfits.c
index ba6818deb..53d6deafb 100644
--- a/tests/tfits.c
+++ b/tests/tfits.c
@@ -39,13 +39,54 @@ http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc.,
} \
while (0)
+#define FTEST(N,NOT,FCT) \
+ do \
+ { \
+ __gmpfr_flags = ex_flags; \
+ if (NOT FCT (x, (mpfr_rnd_t) r)) \
+ { \
+ printf ("Error %d for %s, rnd = %s and x = ", \
+ N, #FCT, \
+ mpfr_print_rnd_mode ((mpfr_rnd_t) r)); \
+ mpfr_dump (x); \
+ exit (1); \
+ } \
+ if (__gmpfr_flags != ex_flags) \
+ { \
+ mpfr_flags_t flags = __gmpfr_flags; \
+ printf ("Flags error %d for %s, rnd = %s and x = ", \
+ N, #FCT, \
+ mpfr_print_rnd_mode ((mpfr_rnd_t) r)); \
+ mpfr_dump(x); \
+ printf ("Expected flags:"); \
+ flags_out (ex_flags); \
+ printf ("Got flags: "); \
+ flags_out (flags); \
+ exit (1); \
+ } \
+ } \
+ while (0)
+
+#define CHECK_ALL(N,NOT) \
+ do \
+ { \
+ FTEST (N, NOT, mpfr_fits_ulong_p); \
+ FTEST (N, NOT, mpfr_fits_slong_p); \
+ FTEST (N, NOT, mpfr_fits_uint_p); \
+ FTEST (N, NOT, mpfr_fits_sint_p); \
+ FTEST (N, NOT, mpfr_fits_ushort_p); \
+ FTEST (N, NOT, mpfr_fits_sshort_p); \
+ } \
+ while (0)
+
static void check_intmax (void);
int
main (void)
{
mpfr_t x, y;
- int i, r;
+ mpfr_flags_t flags[2] = { 0, MPFR_FLAGS_ALL }, ex_flags;
+ int i, r, fi;
tests_start_mpfr ();
@@ -53,149 +94,81 @@ main (void)
mpfr_init2 (y, 8);
RND_LOOP (r)
- {
-
- /* Check NAN */
- mpfr_set_nan (x);
- if (mpfr_fits_ulong_p (x, (mpfr_rnd_t) r))
- ERROR1 (1);
- if (mpfr_fits_slong_p (x, (mpfr_rnd_t) r))
- ERROR1 (2);
- if (mpfr_fits_uint_p (x, (mpfr_rnd_t) r))
- ERROR1 (3);
- if (mpfr_fits_sint_p (x, (mpfr_rnd_t) r))
- ERROR1 (4);
- if (mpfr_fits_ushort_p (x, (mpfr_rnd_t) r))
- ERROR1 (5);
- if (mpfr_fits_sshort_p (x, (mpfr_rnd_t) r))
- ERROR1 (6);
-
- /* Check INF */
- mpfr_set_inf (x, 1);
- if (mpfr_fits_ulong_p (x, (mpfr_rnd_t) r))
- ERROR1 (7);
- if (mpfr_fits_slong_p (x, (mpfr_rnd_t) r))
- ERROR1 (8);
- if (mpfr_fits_uint_p (x, (mpfr_rnd_t) r))
- ERROR1 (9);
- if (mpfr_fits_sint_p (x, (mpfr_rnd_t) r))
- ERROR1 (10);
- if (mpfr_fits_ushort_p (x, (mpfr_rnd_t) r))
- ERROR1 (11);
- if (mpfr_fits_sshort_p (x, (mpfr_rnd_t) r))
- ERROR1 (12);
-
- /* Check Zero */
- MPFR_SET_ZERO (x);
- if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r))
- ERROR1 (13);
- if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r))
- ERROR1 (14);
- if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r))
- ERROR1 (15);
- if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r))
- ERROR1 (16);
- if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r))
- ERROR1 (17);
- if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r))
- ERROR1 (18);
-
- /* Check small positive op */
- mpfr_set_str1 (x, "1@-1");
- if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r))
- ERROR1 (19);
- if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r))
- ERROR1 (20);
- if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r))
- ERROR1 (21);
- if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r))
- ERROR1 (22);
- if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r))
- ERROR1 (23);
- if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r))
- ERROR1 (24);
-
- /* Check 17 */
- mpfr_set_ui (x, 17, MPFR_RNDN);
- if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r))
- ERROR1 (25);
- if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r))
- ERROR1 (26);
- if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r))
- ERROR1 (27);
- if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r))
- ERROR1 (28);
- if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r))
- ERROR1 (29);
- if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r))
- ERROR1 (30);
-
- /* Check all other values */
- mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN);
- mpfr_mul_2exp (x, x, 1, MPFR_RNDN);
- if (mpfr_fits_ulong_p (x, (mpfr_rnd_t) r))
- ERROR1 (31);
- if (mpfr_fits_slong_p (x, (mpfr_rnd_t) r))
- ERROR1 (32);
- mpfr_mul_2exp (x, x, 40, MPFR_RNDN);
- if (mpfr_fits_ulong_p (x, (mpfr_rnd_t) r))
- ERROR1 (33);
- if (mpfr_fits_uint_p (x, (mpfr_rnd_t) r))
- ERROR1 (34);
- if (mpfr_fits_sint_p (x, (mpfr_rnd_t) r))
- ERROR1 (35);
- if (mpfr_fits_ushort_p (x, (mpfr_rnd_t) r))
- ERROR1 (36);
- if (mpfr_fits_sshort_p (x, (mpfr_rnd_t) r))
- ERROR1 (37);
-
- mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN);
- if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r))
- ERROR1 (38);
- mpfr_set_ui (x, LONG_MAX, MPFR_RNDN);
- if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r))
- ERROR1 (39);
- mpfr_set_ui (x, UINT_MAX, MPFR_RNDN);
- if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r))
- ERROR1 (40);
- mpfr_set_ui (x, INT_MAX, MPFR_RNDN);
- if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r))
- ERROR1 (41);
- mpfr_set_ui (x, USHRT_MAX, MPFR_RNDN);
- if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r))
- ERROR1 (42);
- mpfr_set_ui (x, SHRT_MAX, MPFR_RNDN);
- if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r))
- ERROR1 (43);
-
- mpfr_set_si (x, 1, MPFR_RNDN);
- if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r))
- ERROR1 (44);
- if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r))
- ERROR1 (45);
-
- /* Check negative op */
- for (i = 1; i <= 4; i++)
- {
- int inv;
-
- mpfr_set_si_2exp (x, -i, -2, MPFR_RNDN);
- mpfr_rint (y, x, (mpfr_rnd_t) r);
- inv = MPFR_NOTZERO (y);
- if (!mpfr_fits_ulong_p (x, (mpfr_rnd_t) r) ^ inv)
- ERROR1 (46);
- if (!mpfr_fits_slong_p (x, (mpfr_rnd_t) r))
- ERROR1 (47);
- if (!mpfr_fits_uint_p (x, (mpfr_rnd_t) r) ^ inv)
- ERROR1 (48);
- if (!mpfr_fits_sint_p (x, (mpfr_rnd_t) r))
- ERROR1 (49);
- if (!mpfr_fits_ushort_p (x, (mpfr_rnd_t) r) ^ inv)
- ERROR1 (50);
- if (!mpfr_fits_sshort_p (x, (mpfr_rnd_t) r))
- ERROR1 (51);
- }
- }
+ for (fi = 0; fi < numberof (flags); fi++)
+ {
+ ex_flags = flags[fi];
+
+ /* Check NaN */
+ mpfr_set_nan (x);
+ CHECK_ALL (1, !!);
+
+ /* Check +Inf */
+ mpfr_set_inf (x, 1);
+ CHECK_ALL (2, !!);
+
+ /* Check -Inf */
+ mpfr_set_inf (x, -1);
+ CHECK_ALL (3, !!);
+
+ /* Check +0 */
+ mpfr_set_zero (x, 1);
+ CHECK_ALL (4, !);
+
+ /* Check -0 */
+ mpfr_set_zero (x, -1);
+ CHECK_ALL (5, !);
+
+ /* Check small positive op */
+ mpfr_set_str1 (x, "1@-1");
+ CHECK_ALL (6, !);
+
+ /* Check 17 */
+ mpfr_set_ui (x, 17, MPFR_RNDN);
+ CHECK_ALL (7, !);
+
+ /* Check large values (no fit) */
+ mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN);
+ mpfr_mul_2exp (x, x, 1, MPFR_RNDN);
+ CHECK_ALL (8, !!);
+ mpfr_mul_2exp (x, x, 40, MPFR_RNDN);
+ CHECK_ALL (9, !!);
+
+ /* Check min/max of the types (except 0 for unsigned types) */
+ mpfr_set_ui (x, ULONG_MAX, MPFR_RNDN);
+ FTEST (10, !, mpfr_fits_ulong_p);
+ mpfr_set_si (x, LONG_MAX, MPFR_RNDN);
+ FTEST (11, !, mpfr_fits_slong_p);
+ mpfr_set_si (x, LONG_MIN, MPFR_RNDN);
+ FTEST (12, !, mpfr_fits_slong_p);
+ mpfr_set_ui (x, UINT_MAX, MPFR_RNDN);
+ FTEST (13, !, mpfr_fits_uint_p);
+ mpfr_set_si (x, INT_MAX, MPFR_RNDN);
+ FTEST (14, !, mpfr_fits_sint_p);
+ mpfr_set_si (x, INT_MIN, MPFR_RNDN);
+ FTEST (15, !, mpfr_fits_sint_p);
+ mpfr_set_ui (x, USHRT_MAX, MPFR_RNDN);
+ FTEST (16, !, mpfr_fits_ushort_p);
+ mpfr_set_si (x, SHRT_MAX, MPFR_RNDN);
+ FTEST (17, !, mpfr_fits_sshort_p);
+ mpfr_set_si (x, SHRT_MIN, MPFR_RNDN);
+ FTEST (18, !, mpfr_fits_sshort_p);
+
+ /* Check negative op */
+ for (i = 1; i <= 4; i++)
+ {
+ int inv;
+
+ mpfr_set_si_2exp (x, -i, -2, MPFR_RNDN);
+ mpfr_rint (y, x, (mpfr_rnd_t) r);
+ inv = MPFR_NOTZERO (y);
+ FTEST (19, inv ^ !, mpfr_fits_ulong_p);
+ FTEST (19, !, mpfr_fits_slong_p);
+ FTEST (19, inv ^ !, mpfr_fits_uint_p);
+ FTEST (19, !, mpfr_fits_sint_p);
+ FTEST (19, inv ^ !, mpfr_fits_ushort_p);
+ FTEST (19, !, mpfr_fits_sshort_p);
+ }
+ }
mpfr_clear (x);
mpfr_clear (y);