summaryrefslogtreecommitdiff
path: root/tests
diff options
context:
space:
mode:
authorvlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2002-04-11 01:54:09 +0000
committervlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4>2002-04-11 01:54:09 +0000
commitee0235eb2359f239229fa5c0c5117476ea705f39 (patch)
treed1438350891f02a2131e003fdcef4369d82b2a9b /tests
parent18945e4a49e3fcb95b6b50118eca65333de4a2cc (diff)
downloadmpfr-ee0235eb2359f239229fa5c0c5117476ea705f39.tar.gz
Tests added.
git-svn-id: svn://scm.gforge.inria.fr/svn/mpfr/trunk@1851 280ebfd0-de03-0410-8827-d642c229c3f4
Diffstat (limited to 'tests')
-rw-r--r--tests/tget_d.c204
1 files changed, 108 insertions, 96 deletions
diff --git a/tests/tget_d.c b/tests/tget_d.c
index 6f2881cdc..9e94651ac 100644
--- a/tests/tget_d.c
+++ b/tests/tget_d.c
@@ -34,24 +34,30 @@ void
check_denorms ()
{
mpfr_t x;
- double d, dd;
- unsigned long int n;
-
- mpfr_init2 (x, 2);
-
- d = DBL_MIN; /* 2^(-1022) */
- mpfr_set_ui (x, 1, GMP_RNDN);
- mpfr_div_2exp (x, x, 1022, GMP_RNDN); /* 2^(-1022) */
- for (n=0; n<52; n++, d /= 2.0)
+ double d, d2, dd, f;
+ int k, n;
+
+ mpfr_init2 (x, BITS_PER_MP_LIMB);
+
+ for (k = 1; k <= 7; k += 2)
{
- dd = mpfr_get_d1 (x);
- if (d != dd) /* should be 0 or 2^(-1022-n) */
+ d = k * DBL_MIN; /* k * 2^(-1022) */
+ f = 1.0;
+ mpfr_set_ui (x, k, GMP_RNDN);
+ mpfr_div_2exp (x, x, 1022, GMP_RNDN); /* k * 2^(-1022) */
+ for (n=0; n<=53; n++)
{
- fprintf (stderr, "Wrong result for 2^(%ld), ", -1022-n);
- fprintf (stderr, "got %.20e instead of %.20e\n", dd, d);
- exit (1);
+ d2 = d * f;
+ dd = mpfr_get_d (x, GMP_RNDN);
+ if (d2 != dd) /* should be k * 2^(-1022-n) for n < 53 */
+ {
+ fprintf (stderr, "Wrong result for %d * 2^(%d), ", k, -1022-n);
+ fprintf (stderr, "got %.20e instead of %.20e\n", dd, d2);
+ exit (1);
+ }
+ f *= 0.5;
+ mpfr_div_2exp (x, x, 1, GMP_RNDN);
}
- mpfr_div_2exp (x, x, 1, GMP_RNDN);
}
mpfr_clear (x);
@@ -63,89 +69,95 @@ main (void)
#ifdef MPFR_HAVE_FESETROUND
- mpfr_t half, x, y;
- mp_rnd_t rnd_mode;
-
- mpfr_init2(half, 2);
- mpfr_set_ui(half, 1, GMP_RNDZ);
- mpfr_div_2ui(half, half, 1, GMP_RNDZ); /* has exponent 0 */
-
- mpfr_init2(x, 128);
- mpfr_init2(y, 128);
-
- mpfr_test_init ();
-
- for (rnd_mode = 0; rnd_mode <= 3; rnd_mode++)
- {
- int i, j, si, sj;
- double di, dj;
-
- mpfr_set_machine_rnd_mode (rnd_mode);
- for (i = 1, di = 0.25; i < 127; i++, di *= 0.5)
- for (si = 0; si <= 1; si++)
- {
- mpfr_div_2ui (x, half, i, GMP_RNDZ);
- (si ? mpfr_sub : mpfr_add)(x, half, x, GMP_RNDZ);
- /* x = 1/2 +/- 1/2^(1+i) */
- for (j = i+1, dj = di * 0.5; j < 128 && j < i+53; j++, dj *= 0.5)
- for (sj = 0; sj <= 1; sj++)
- {
- double c, d, dd;
- int exp;
- char *f;
-
- mpfr_div_2ui (y, half, j, GMP_RNDZ);
- (sj ? mpfr_sub : mpfr_add)(y, x, y, GMP_RNDZ);
- /* y = 1/2 +/- 1/2^(1+i) +/- 1/2^(1+j) */
- exp = (LONG_RAND() % 47) - 23;
- mpfr_mul_2si (y, y, exp, GMP_RNDZ);
- if (mpfr_inexflag_p())
- {
- fprintf(stderr, "Error in tget_d: inexact flag for "
- "(i,si,j,sj,rnd,exp) = (%d,%d,%d,%d,%d,%d)\n",
- i, si, j, sj, rnd_mode, exp);
- exit(1);
- }
- dd = si != sj ? di - dj : di + dj;
- d = si ? 0.5 - dd : 0.5 + dd;
- if ((LONG_RAND() / 1024) & 1)
- {
- c = mpfr_get_d (y, rnd_mode);
- f = "mpfr_get_d";
- }
- else
- {
- exp = (LONG_RAND() % 47) - 23;
- c = mpfr_get_d3 (y, exp, rnd_mode);
- f = "mpfr_get_d3";
- if (si) /* then real d < 0.5 */
- d *= sj && i == 1 ? 4 : 2; /* normalize real d */
- }
- if (exp > 0)
- d *= 1 << exp;
- if (exp < 0)
- d /= 1 << -exp;
- if (c != d)
- {
- fprintf (stderr, "Error in tget_d (%s) for "
- "(i,si,j,sj,rnd,exp) = (%d,%d,%d,%d,%d,%d)\n"
- "got %.25Le instead of %.25Le\n"
- "Difference: %.19e\n",
- f, i, si, j, sj, rnd_mode, exp,
- (long double) c, (long double) d, d - c);
- exit (1);
- }
- }
- }
- }
-
- mpfr_clear(half);
- mpfr_clear(x);
- mpfr_clear(y);
+ mpfr_t half, x, y;
+ mp_rnd_t rnd_mode;
+
+#endif
+
+ mpfr_test_init ();
+
+#ifdef MPFR_HAVE_FESETROUND
+
+ mpfr_init2(half, 2);
+ mpfr_set_ui(half, 1, GMP_RNDZ);
+ mpfr_div_2ui(half, half, 1, GMP_RNDZ); /* has exponent 0 */
+
+ mpfr_init2(x, 128);
+ mpfr_init2(y, 128);
+
+ mpfr_test_init ();
+
+ for (rnd_mode = 0; rnd_mode <= 3; rnd_mode++)
+ {
+ int i, j, si, sj;
+ double di, dj;
+
+ mpfr_set_machine_rnd_mode (rnd_mode);
+ for (i = 1, di = 0.25; i < 127; i++, di *= 0.5)
+ for (si = 0; si <= 1; si++)
+ {
+ mpfr_div_2ui (x, half, i, GMP_RNDZ);
+ (si ? mpfr_sub : mpfr_add)(x, half, x, GMP_RNDZ);
+ /* x = 1/2 +/- 1/2^(1+i) */
+ for (j = i+1, dj = di * 0.5; j < 128 && j < i+53; j++, dj *= 0.5)
+ for (sj = 0; sj <= 1; sj++)
+ {
+ double c, d, dd;
+ int exp;
+ char *f;
+
+ mpfr_div_2ui (y, half, j, GMP_RNDZ);
+ (sj ? mpfr_sub : mpfr_add)(y, x, y, GMP_RNDZ);
+ /* y = 1/2 +/- 1/2^(1+i) +/- 1/2^(1+j) */
+ exp = (LONG_RAND() % 47) - 23;
+ mpfr_mul_2si (y, y, exp, GMP_RNDZ);
+ if (mpfr_inexflag_p())
+ {
+ fprintf(stderr, "Error in tget_d: inexact flag for "
+ "(i,si,j,sj,rnd,exp) = (%d,%d,%d,%d,%d,%d)\n",
+ i, si, j, sj, rnd_mode, exp);
+ exit(1);
+ }
+ dd = si != sj ? di - dj : di + dj;
+ d = si ? 0.5 - dd : 0.5 + dd;
+ if ((LONG_RAND() / 1024) & 1)
+ {
+ c = mpfr_get_d (y, rnd_mode);
+ f = "mpfr_get_d";
+ }
+ else
+ {
+ exp = (LONG_RAND() % 47) - 23;
+ c = mpfr_get_d3 (y, exp, rnd_mode);
+ f = "mpfr_get_d3";
+ if (si) /* then real d < 0.5 */
+ d *= sj && i == 1 ? 4 : 2; /* normalize real d */
+ }
+ if (exp > 0)
+ d *= 1 << exp;
+ if (exp < 0)
+ d /= 1 << -exp;
+ if (c != d)
+ {
+ fprintf (stderr, "Error in tget_d (%s) for "
+ "(i,si,j,sj,rnd,exp) = (%d,%d,%d,%d,%d,%d)\n"
+ "got %.25Le instead of %.25Le\n"
+ "Difference: %.19e\n",
+ f, i, si, j, sj, rnd_mode, exp,
+ (long double) c, (long double) d, d - c);
+ exit (1);
+ }
+ }
+ }
+ }
+
+ mpfr_clear(half);
+ mpfr_clear(x);
+ mpfr_clear(y);
#endif
- check_denorms ();
+ check_denorms ();
- return 0;
+ return 0;
}