summaryrefslogtreecommitdiff
path: root/mpfr/tests/tset_q.c
diff options
context:
space:
mode:
Diffstat (limited to 'mpfr/tests/tset_q.c')
-rw-r--r--mpfr/tests/tset_q.c72
1 files changed, 51 insertions, 21 deletions
diff --git a/mpfr/tests/tset_q.c b/mpfr/tests/tset_q.c
index d833378cd..9807c6ea8 100644
--- a/mpfr/tests/tset_q.c
+++ b/mpfr/tests/tset_q.c
@@ -1,24 +1,25 @@
/* Test file for mpfr_set_q.
-Copyright (C) 2000 Free Software Foundation.
+Copyright (C) 2000, 2001 Free Software Foundation, Inc.
This file is part of the MPFR Library.
The MPFR Library is free software; you can redistribute it and/or modify
-it under the terms of the GNU Library General Public License as published by
-the Free Software Foundation; either version 2 of the License, or (at your
+it under the terms of the GNU Lesser General Public License as published by
+the Free Software Foundation; either version 2.1 of the License, or (at your
option) any later version.
The MPFR Library is distributed in the hope that it will be useful, but
WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY
-or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public
+or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Lesser General Public
License for more details.
-You should have received a copy of the GNU Library General Public License
+You should have received a copy of the GNU Lesser General Public License
along with the MPFR Library; see the file COPYING.LIB. If not, write to
the Free Software Foundation, Inc., 59 Temple Place - Suite 330, Boston,
MA 02111-1307, USA. */
+#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include "gmp.h"
@@ -26,29 +27,57 @@ MA 02111-1307, USA. */
void check _PROTO((long int, long int, mp_rnd_t, double));
-void check(long int n, long int d, mp_rnd_t rnd, double y)
+void
+check (long int n, long int d, mp_rnd_t rnd, double y)
{
- mpq_t q; mpfr_t x; double z;
+ mpq_t q;
+ mpfr_t x, t;
+ double z;
+ int inexact, compare;
- mpfr_init2(x, 53); mpq_init(q);
- mpq_set_si(q, n, d);
+ mpfr_init2 (x, 53);
+ mpfr_init2 (t, mpfr_get_prec (x) + mp_bits_per_limb);
+ mpq_init (q);
+ mpq_set_si (q, n, d);
#ifdef TEST
- mpfr_set_machine_rnd_mode(rnd);
+ mpfr_set_machine_rnd_mode (rnd);
y = (double) n / d;
#endif
- mpfr_set_q(x, q, rnd);
- z = mpfr_get_d(x);
- if (y != z) {
- fprintf(stderr, "Error for q=%ld/%lu and rnd=%s\n", n, d,
- mpfr_print_rnd_mode(rnd));
- fprintf(stderr, "libm.a gives %1.20e, mpfr_set_q gives %1.20e\n",
- y, z);
- exit(1);
- }
- mpfr_clear(x); mpq_clear(q);
+ inexact = mpfr_set_q (x, q, rnd);
+ z = mpfr_get_d (x);
+
+ /* check values */
+ if (y != z)
+ {
+ fprintf (stderr, "Error for q=%ld/%lu and rnd=%s\n", n, d,
+ mpfr_print_rnd_mode (rnd));
+ fprintf (stderr, "libm.a gives %1.20e, mpfr_set_q gives %1.20e\n", y, z);
+ exit (1);
+ }
+
+ /* check inexact flag */
+ if (mpfr_mul_ui (t, x, (d < 0) ? (-d) : d, rnd))
+ {
+ fprintf (stderr, "t <- x * d should be exact\n");
+ exit (1);
+ }
+ compare = mpfr_cmp_si (t, n);
+ if (((inexact == 0) && (compare != 0)) ||
+ ((inexact < 0) && (compare >= 0)) ||
+ ((inexact > 0) && (compare <= 0)))
+ {
+ fprintf (stderr, "wrong inexact flag: expected %d, got %d\n", compare,
+ inexact);
+ exit (1);
+ }
+
+ mpfr_clear (x);
+ mpfr_clear (t);
+ mpq_clear (q);
}
-int main()
+int
+main (void)
{
#ifdef TEST
long int i, n;
@@ -74,5 +103,6 @@ int main()
check(75504803, 400207282, GMP_RNDU, 1.8866424074712365155e-1);
check(643562308, 23100894, GMP_RNDD, 2.7858762002890447462e1);
check(632549085, 1831935802, GMP_RNDN, 3.4528998467600230393e-1);
+
return 0;
}