diff -Naurd mpfr-4.1.0-a/PATCHES mpfr-4.1.0-b/PATCHES --- mpfr-4.1.0-a/PATCHES 2021-02-11 12:53:38.382850990 +0000 +++ mpfr-4.1.0-b/PATCHES 2021-02-11 12:53:38.426850512 +0000 @@ -0,0 +1 @@ +jn-interm-zero diff -Naurd mpfr-4.1.0-a/VERSION mpfr-4.1.0-b/VERSION --- mpfr-4.1.0-a/VERSION 2021-02-11 12:52:52.563350183 +0000 +++ mpfr-4.1.0-b/VERSION 2021-02-11 12:53:38.426850512 +0000 @@ -1 +1 @@ -4.1.0-p6 +4.1.0-p7 diff -Naurd mpfr-4.1.0-a/src/jyn_asympt.c mpfr-4.1.0-b/src/jyn_asympt.c --- mpfr-4.1.0-a/src/jyn_asympt.c 2020-07-10 10:33:32.000000000 +0000 +++ mpfr-4.1.0-b/src/jyn_asympt.c 2021-02-11 12:53:38.410850685 +0000 @@ -69,6 +69,8 @@ MPFR_ZIV_INIT (loop, w); for (;;) { + int ok = 1; + mpfr_set_prec (c, w); mpfr_init2 (s, w); mpfr_init2 (P, w); @@ -92,6 +94,13 @@ /* now s approximates sin(z)+cos(z), and c approximates sin(z)-cos(z), with total absolute error bounded by 2^(1-w). */ + /* if s or c is zero, MPFR_GET_EXP will fail below */ + if (MPFR_IS_ZERO(s) || MPFR_IS_ZERO(c)) + { + ok = 0; + goto clear; + } + /* precompute 1/(8|z|) */ mpfr_si_div (iz, MPFR_IS_POS(z) ? 1 : -1, z, MPFR_RNDN); /* err <= 1 */ mpfr_div_2ui (iz, iz, 3, MPFR_RNDN); @@ -257,6 +266,9 @@ err = (err >= err2) ? err + 1 : err2 + 1; /* the absolute error on c is bounded by 2^(err - w) */ + err -= MPFR_GET_EXP (c); + + clear: mpfr_clear (s); mpfr_clear (P); mpfr_clear (Q); @@ -266,8 +278,7 @@ mpfr_clear (err_s); mpfr_clear (err_u); - err -= MPFR_GET_EXP (c); - if (MPFR_LIKELY (MPFR_CAN_ROUND (c, w - err, MPFR_PREC(res), r))) + if (ok && MPFR_LIKELY (MPFR_CAN_ROUND (c, w - err, MPFR_PREC(res), r))) break; if (diverge != 0) { diff -Naurd mpfr-4.1.0-a/src/mpfr.h mpfr-4.1.0-b/src/mpfr.h --- mpfr-4.1.0-a/src/mpfr.h 2021-02-11 12:52:52.559350226 +0000 +++ mpfr-4.1.0-b/src/mpfr.h 2021-02-11 12:53:38.422850555 +0000 @@ -27,7 +27,7 @@ #define MPFR_VERSION_MAJOR 4 #define MPFR_VERSION_MINOR 1 #define MPFR_VERSION_PATCHLEVEL 0 -#define MPFR_VERSION_STRING "4.1.0-p6" +#define MPFR_VERSION_STRING "4.1.0-p7" /* User macros: MPFR_USE_FILE: Define it to make MPFR define functions dealing diff -Naurd mpfr-4.1.0-a/src/version.c mpfr-4.1.0-b/src/version.c --- mpfr-4.1.0-a/src/version.c 2021-02-11 12:52:52.559350226 +0000 +++ mpfr-4.1.0-b/src/version.c 2021-02-11 12:53:38.426850512 +0000 @@ -25,5 +25,5 @@ const char * mpfr_get_version (void) { - return "4.1.0-p6"; + return "4.1.0-p7"; } diff -Naurd mpfr-4.1.0-a/tests/tj0.c mpfr-4.1.0-b/tests/tj0.c --- mpfr-4.1.0-a/tests/tj0.c 2020-01-08 18:11:13.000000000 +0000 +++ mpfr-4.1.0-b/tests/tj0.c 2021-02-11 12:53:38.410850685 +0000 @@ -27,6 +27,25 @@ #define REDUCE_EMAX 262143 /* otherwise arg. reduction is too expensive */ #include "tgeneric.c" +/* bug found in revision 14399 with GMP_CHECK_RANDOMIZE=1612721106588971 */ +static void +bug20210208 (void) +{ + mpfr_t x, y; + int inex; + + mpfr_init2 (x, 79); + mpfr_init2 (y, 1); + mpfr_set_str (x, "2.552495117262005805960565e+02", 10, MPFR_RNDN); + mpfr_clear_flags (); + inex = mpfr_j0 (y, x, MPFR_RNDZ); + MPFR_ASSERTN (mpfr_cmp_si_2exp (y, -1, -5) == 0); + MPFR_ASSERTN (inex > 0); + MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_INEXACT); + mpfr_clear (x); + mpfr_clear (y); +} + int main (int argc, char *argv[]) { @@ -35,6 +54,8 @@ tests_start_mpfr (); + bug20210208 (); + mpfr_init (x); mpfr_init (y);