diff -Naur mpfr-2.1.2/exp.c mpfr-2.1.2-p1/exp.c --- mpfr-2.1.2/exp.c 2005-01-29 11:42:08.000000000 +0000 +++ mpfr-2.1.2-p1/exp.c 2005-09-13 14:53:34.000000000 +0000 @@ -83,7 +83,8 @@ int signx = MPFR_SIGN(x); MPFR_SET_POS(y); - if (MPFR_IS_NEG_SIGN(signx) && (rnd_mode == GMP_RNDD)) + if (MPFR_IS_NEG_SIGN(signx) && (rnd_mode == GMP_RNDD || + rnd_mode == GMP_RNDZ)) { mpfr_setmax (y, 0); /* y = 1 - epsilon */ return -1; diff -Naur mpfr-2.1.2/tests/texp.c mpfr-2.1.2-p1/tests/texp.c --- mpfr-2.1.2/tests/texp.c 2005-03-09 07:58:55.000000000 +0000 +++ mpfr-2.1.2-p1/tests/texp.c 2005-09-13 14:53:35.000000000 +0000 @@ -250,12 +250,16 @@ if (mpfr_cmp_ui_2exp (y, 3, -2)) { printf ("Error for exp(-1/16), prec=2, RNDD\n"); + printf ("expected 0.11, got "); + mpfr_dump (y); exit (1); } mpfr_exp (y, x, GMP_RNDZ); - if (mpfr_cmp_ui (y, 1)) + if (mpfr_cmp_ui_2exp (y, 3, -2)) { printf ("Error for exp(-1/16), prec=2, RNDZ\n"); + printf ("expected 0.11, got "); + mpfr_dump (y); exit (1); } mpfr_set_str_binary (x, "0.1E-3"); @@ -361,6 +365,16 @@ mpfr_out_str (stdout, 16, 0, x, GMP_RNDN); putchar ('\n'); } + /* bug found by Guillaume Melquiond, 13 Sep 2005 */ + mpfr_set_prec (x, 53); + mpfr_set_str_binary (x, "-1E-400"); + mpfr_exp (x, x, GMP_RNDZ); + if (mpfr_cmp_ui (x, 1) == 0) + { + printf ("Error for exp(-2^(-400))\n"); + exit (1); + } + mpfr_clear (x); mpfr_clear (y); }