diff -Naurd mpfr-4.0.1-a/PATCHES mpfr-4.0.1-b/PATCHES --- mpfr-4.0.1-a/PATCHES 2018-07-10 15:33:45.189532503 +0000 +++ mpfr-4.0.1-b/PATCHES 2018-07-10 15:33:45.265532432 +0000 @@ -0,0 +1 @@ +set_d64-ternary diff -Naurd mpfr-4.0.1-a/VERSION mpfr-4.0.1-b/VERSION --- mpfr-4.0.1-a/VERSION 2018-07-10 15:29:08.017776303 +0000 +++ mpfr-4.0.1-b/VERSION 2018-07-10 15:33:45.261532435 +0000 @@ -1 +1 @@ -4.0.1-p7 +4.0.1-p8 diff -Naurd mpfr-4.0.1-a/src/mpfr.h mpfr-4.0.1-b/src/mpfr.h --- mpfr-4.0.1-a/src/mpfr.h 2018-07-10 15:29:08.013776307 +0000 +++ mpfr-4.0.1-b/src/mpfr.h 2018-07-10 15:33:45.261532435 +0000 @@ -27,7 +27,7 @@ #define MPFR_VERSION_MAJOR 4 #define MPFR_VERSION_MINOR 0 #define MPFR_VERSION_PATCHLEVEL 1 -#define MPFR_VERSION_STRING "4.0.1-p7" +#define MPFR_VERSION_STRING "4.0.1-p8" /* User macros: MPFR_USE_FILE: Define it to make MPFR define functions dealing diff -Naurd mpfr-4.0.1-a/src/set_d64.c mpfr-4.0.1-b/src/set_d64.c --- mpfr-4.0.1-a/src/set_d64.c 2018-01-09 12:30:58.000000000 +0000 +++ mpfr-4.0.1-b/src/set_d64.c 2018-07-10 15:33:45.237532458 +0000 @@ -425,7 +425,7 @@ 1 character for terminating \0. */ decimal64_to_string (s, d); - return mpfr_set_str (r, s, 10, rnd_mode); + return mpfr_strtofr (r, s, NULL, 10, rnd_mode); } #endif /* MPFR_WANT_DECIMAL_FLOATS */ diff -Naurd mpfr-4.0.1-a/src/version.c mpfr-4.0.1-b/src/version.c --- mpfr-4.0.1-a/src/version.c 2018-07-10 15:29:08.017776303 +0000 +++ mpfr-4.0.1-b/src/version.c 2018-07-10 15:33:45.261532435 +0000 @@ -25,5 +25,5 @@ const char * mpfr_get_version (void) { - return "4.0.1-p7"; + return "4.0.1-p8"; } diff -Naurd mpfr-4.0.1-a/tests/tget_set_d64.c mpfr-4.0.1-b/tests/tget_set_d64.c --- mpfr-4.0.1-a/tests/tget_set_d64.c 2018-01-09 12:30:58.000000000 +0000 +++ mpfr-4.0.1-b/tests/tget_set_d64.c 2018-07-10 15:33:45.237532458 +0000 @@ -381,6 +381,66 @@ mpfr_clear (x); } +static void +powers_of_10 (void) +{ + mpfr_t x1, x2; + _Decimal64 d[2]; + int i, rnd; + unsigned int neg; + + mpfr_inits2 (200, x1, x2, (mpfr_ptr) 0); + for (i = 0, d[0] = 1, d[1] = 1; i < 150; i++, d[0] *= 10, d[1] /= 10) + for (neg = 0; neg <= 3; neg++) + RND_LOOP_NO_RNDF (rnd) + { + int inex1, inex2; + mpfr_flags_t flags1, flags2; + mpfr_rnd_t rx1; + _Decimal64 dd; + + inex1 = mpfr_set_si (x1, (neg >> 1) ? -i : i, MPFR_RNDN); + MPFR_ASSERTN (inex1 == 0); + + rx1 = (neg & 1) ? + MPFR_INVERT_RND ((mpfr_rnd_t) rnd) : (mpfr_rnd_t) rnd; + mpfr_clear_flags (); + inex1 = mpfr_exp10 (x1, x1, rx1); + flags1 = __gmpfr_flags; + + dd = d[neg >> 1]; + + if (neg & 1) + { + MPFR_SET_NEG (x1); + inex1 = -inex1; + dd = -dd; + } + + mpfr_clear_flags (); + inex2 = mpfr_set_decimal64 (x2, dd, (mpfr_rnd_t) rnd); + flags2 = __gmpfr_flags; + + if (!(mpfr_equal_p (x1, x2) && + SAME_SIGN (inex1, inex2) && + flags1 == flags2)) + { + printf ("Error in powers_of_10 for i=%d, neg=%d, %s\n", + i, neg, mpfr_print_rnd_mode ((mpfr_rnd_t) rnd)); + printf ("Expected "); + mpfr_dump (x1); + printf ("with inex = %d and flags =", inex1); + flags_out (flags1); + printf ("Got "); + mpfr_dump (x2); + printf ("with inex = %d and flags =", inex2); + flags_out (flags2); + exit (1); + } + } + mpfr_clears (x1, x2, (mpfr_ptr) 0); +} + int main (void) { @@ -401,6 +461,7 @@ check_overflow (); #endif check_tiny (); + powers_of_10 (); tests_end_mpfr (); return 0;