diff options
author | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2002-04-11 01:54:09 +0000 |
---|---|---|
committer | vlefevre <vlefevre@280ebfd0-de03-0410-8827-d642c229c3f4> | 2002-04-11 01:54:09 +0000 |
commit | ee0235eb2359f239229fa5c0c5117476ea705f39 (patch) | |
tree | d1438350891f02a2131e003fdcef4369d82b2a9b /tests | |
parent | 18945e4a49e3fcb95b6b50118eca65333de4a2cc (diff) | |
download | mpfr-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.c | 204 |
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; } |