diff --git a/.gitignore b/.gitignore index 217d397..1a3e231 100644 --- a/.gitignore +++ b/.gitignore @@ -4,3 +4,4 @@ /mpfr-3.1.3.tar.xz /mpfr-3.1.4.tar.xz /mpfr-3.1.5.tar.xz +/mpfr-3.1.6.tar.xz diff --git a/mpfr.spec b/mpfr.spec index 5725b9b..5503110 100644 --- a/mpfr.spec +++ b/mpfr.spec @@ -1,16 +1,24 @@ Summary: A C library for multiple-precision floating-point computations Name: mpfr -Version: 3.1.5 -Release: 6%{?dist} +Version: 3.1.6 +Release: 1%{?dist} URL: http://www.mpfr.org/ -Source0: http://www.mpfr.org/mpfr-current/%{name}-%{version}.tar.xz -# GFDL (mpfr.texi, mpfr.info and fdl.texi) +# GFDL (mpfr.texi, mpfr.info and fdl.texi) License: LGPLv3+ and GPLv3+ and GFDL - -BuildRequires: autoconf libtool gmp-devel +BuildRequires: autoconf libtool gmp-devel gcc Requires(post): /sbin/ldconfig Requires(postun): /sbin/ldconfig -Requires: gmp >= 4.2.1 +Requires: gmp >= 4.2.3 + +Source0: http://www.mpfr.org/%{name}-%{version}/%{name}-%{version}.tar.xz + +# https://gforge.inria.fr/scm/viewvc.php/mpfr?revision=11783&view=revision +# http://www.mpfr.org/mpfr-3.1.6/patch01 +Patch0: rev11783.patch + +# https://gforge.inria.fr/scm/viewvc.php/mpfr?revision=11982&view=revision +# http://www.mpfr.org/mpfr-3.1.6/patch02 +Patch1: rev11982.patch %description The MPFR library is a C library for multiple-precision floating-point @@ -20,7 +28,7 @@ ANSI/IEEE-754 standard for double-precision floating-point arithmetic (53-bit mantissa). MPFR is based on the GMP multiple-precision library. %package devel -Summary: Development tools A C library for mpfr library +Summary: Development files for the MPFR library Requires: %{name} = %{version}-%{release} Requires(post): /sbin/install-info Requires(preun): /sbin/install-info @@ -31,19 +39,17 @@ Header files and documentation for using the MPFR multiple-precision floating-point library in applications. If you want to develop applications which will use the MPFR library, -you'll need to install the mpfr-devel package. You'll also need to +you'll need to install the mpfr-devel package. You'll also need to install the mpfr package. %prep -%setup -q +%autosetup -p1 %build %configure --disable-assert --disable-static make %{?_smp_mflags} %install -iconv -f iso-8859-1 -t utf-8 doc/mpfr.info > doc/mpfr.info.aux -mv doc/mpfr.info.aux doc/mpfr.info make install DESTDIR=$RPM_BUILD_ROOT rm -f $RPM_BUILD_ROOT%{_libdir}/libmpfr.la rm -f $RPM_BUILD_ROOT%{_infodir}/dir @@ -82,6 +88,14 @@ fi %{_infodir}/mpfr.info* %changelog +* Sun Feb 25 2018 James Paul Turner - 3.1.6-1 +- Update to MPFR version 3.1.6 +- Use autosetup specfile macro for applying patches (patches 1 and 2 applied) +- Removed iconv calls, as they were breaking .info files, which are now unicode + resolves #1299649 +- Other minor cleanups +- BuildRequire gcc per https://fedoraproject.org/wiki/Packaging:C_and_C%2B%2B#BuildRequires_and_Requires + * Thu Feb 08 2018 Fedora Release Engineering - 3.1.5-6 - Rebuilt for https://fedoraproject.org/wiki/Fedora_28_Mass_Rebuild diff --git a/rev11783.patch b/rev11783.patch new file mode 100644 index 0000000..5c742f0 --- /dev/null +++ b/rev11783.patch @@ -0,0 +1,285 @@ +diff -Naurd mpfr-3.1.6-a/PATCHES mpfr-3.1.6-b/PATCHES +--- mpfr-3.1.6-a/PATCHES 2017-10-26 13:55:51.168013439 +0000 ++++ mpfr-3.1.6-b/PATCHES 2017-10-26 13:55:51.236013121 +0000 +@@ -0,0 +1 @@ ++mpfr_get +diff -Naurd mpfr-3.1.6-a/VERSION mpfr-3.1.6-b/VERSION +--- mpfr-3.1.6-a/VERSION 2017-09-07 11:36:44.000000000 +0000 ++++ mpfr-3.1.6-b/VERSION 2017-10-26 13:55:51.236013121 +0000 +@@ -1 +1 @@ +-3.1.6 ++3.1.6-p1 +diff -Naurd mpfr-3.1.6-a/src/get_ld.c mpfr-3.1.6-b/src/get_ld.c +--- mpfr-3.1.6-a/src/get_ld.c 2017-01-01 01:39:09.000000000 +0000 ++++ mpfr-3.1.6-b/src/get_ld.c 2017-10-26 13:55:51.208013252 +0000 +@@ -41,6 +41,9 @@ + mpfr_exp_t sh; /* exponent shift, so that x/2^sh is in the double range */ + mpfr_t y, z; + int sign; ++ MPFR_SAVE_EXPO_DECL (expo); ++ ++ MPFR_SAVE_EXPO_MARK (expo); + + /* first round x to the target long double precision, so that + all subsequent operations are exact (this avoids double rounding +@@ -103,6 +106,7 @@ + } + if (sign < 0) + r = -r; ++ MPFR_SAVE_EXPO_FREE (expo); + return r; + } + } +diff -Naurd mpfr-3.1.6-a/src/get_si.c mpfr-3.1.6-b/src/get_si.c +--- mpfr-3.1.6-a/src/get_si.c 2017-01-01 01:39:09.000000000 +0000 ++++ mpfr-3.1.6-b/src/get_si.c 2017-10-26 13:55:51.208013252 +0000 +@@ -28,6 +28,7 @@ + mpfr_prec_t prec; + long s; + mpfr_t x; ++ MPFR_SAVE_EXPO_DECL (expo); + + if (MPFR_UNLIKELY (!mpfr_fits_slong_p (f, rnd))) + { +@@ -39,14 +40,22 @@ + if (MPFR_IS_ZERO (f)) + return (long) 0; + +- /* determine prec of long */ +- for (s = LONG_MIN, prec = 0; s != 0; s /= 2, prec++) ++ /* Determine the precision of long. |LONG_MIN| may have one more bit ++ as an integer, but in this case, this is a power of 2, thus fits ++ in a precision-prec floating-point number. */ ++ for (s = LONG_MAX, prec = 0; s != 0; s /= 2, prec++) + { } + ++ MPFR_SAVE_EXPO_MARK (expo); ++ + /* first round to prec bits */ + mpfr_init2 (x, prec); + mpfr_rint (x, f, rnd); + ++ /* The flags from mpfr_rint are the wanted ones. In particular, ++ it sets the inexact flag when necessary. */ ++ MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags); ++ + /* warning: if x=0, taking its exponent is illegal */ + if (MPFR_UNLIKELY (MPFR_IS_ZERO(x))) + s = 0; +@@ -65,5 +74,7 @@ + + mpfr_clear (x); + ++ MPFR_SAVE_EXPO_FREE (expo); ++ + return s; + } +diff -Naurd mpfr-3.1.6-a/src/get_sj.c mpfr-3.1.6-b/src/get_sj.c +--- mpfr-3.1.6-a/src/get_sj.c 2017-01-01 01:39:09.000000000 +0000 ++++ mpfr-3.1.6-b/src/get_sj.c 2017-10-26 13:55:51.208013252 +0000 +@@ -35,6 +35,7 @@ + intmax_t r; + mpfr_prec_t prec; + mpfr_t x; ++ MPFR_SAVE_EXPO_DECL (expo); + + if (MPFR_UNLIKELY (!mpfr_fits_intmax_p (f, rnd))) + { +@@ -46,20 +47,24 @@ + if (MPFR_IS_ZERO (f)) + return (intmax_t) 0; + +- /* determine the precision of intmax_t */ +- for (r = MPFR_INTMAX_MIN, prec = 0; r != 0; r /= 2, prec++) ++ /* Determine the precision of intmax_t. |INTMAX_MIN| may have one ++ more bit as an integer, but in this case, this is a power of 2, ++ thus fits in a precision-prec floating-point number. */ ++ for (r = MPFR_INTMAX_MAX, prec = 0; r != 0; r /= 2, prec++) + { } +- /* Note: though INTMAX_MAX would have been sufficient for the conversion, +- we chose INTMAX_MIN so that INTMAX_MIN - 1 is always representable in +- precision prec; this is useful to detect overflows in MPFR_RNDZ (will +- be needed later). */ + +- /* Now, r = 0. */ ++ MPFR_ASSERTD (r == 0); ++ ++ MPFR_SAVE_EXPO_MARK (expo); + + mpfr_init2 (x, prec); + mpfr_rint (x, f, rnd); + MPFR_ASSERTN (MPFR_IS_FP (x)); + ++ /* The flags from mpfr_rint are the wanted ones. In particular, ++ it sets the inexact flag when necessary. */ ++ MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags); ++ + if (MPFR_NOTZERO (x)) + { + mp_limb_t *xp; +@@ -67,15 +72,15 @@ + + xp = MPFR_MANT (x); + sh = MPFR_GET_EXP (x); +- MPFR_ASSERTN ((mpfr_prec_t) sh <= prec); ++ MPFR_ASSERTN ((mpfr_prec_t) sh <= prec + 1); + if (MPFR_INTMAX_MIN + MPFR_INTMAX_MAX != 0 +- && MPFR_UNLIKELY ((mpfr_prec_t) sh == prec)) ++ && MPFR_UNLIKELY ((mpfr_prec_t) sh > prec)) + { + /* 2's complement and x <= INTMAX_MIN: in the case mp_limb_t + has the same size as intmax_t, we cannot use the code in + the for loop since the operations would be performed in + unsigned arithmetic. */ +- MPFR_ASSERTN (MPFR_IS_NEG (x) && (mpfr_powerof2_raw (x))); ++ MPFR_ASSERTN (MPFR_IS_NEG (x) && mpfr_powerof2_raw (x)); + r = MPFR_INTMAX_MIN; + } + else if (MPFR_IS_POS (x)) +@@ -117,6 +122,8 @@ + + mpfr_clear (x); + ++ MPFR_SAVE_EXPO_FREE (expo); ++ + return r; + } + +diff -Naurd mpfr-3.1.6-a/src/get_ui.c mpfr-3.1.6-b/src/get_ui.c +--- mpfr-3.1.6-a/src/get_ui.c 2017-01-01 01:39:09.000000000 +0000 ++++ mpfr-3.1.6-b/src/get_ui.c 2017-10-26 13:55:51.208013252 +0000 +@@ -30,6 +30,7 @@ + mpfr_t x; + mp_size_t n; + mpfr_exp_t exp; ++ MPFR_SAVE_EXPO_DECL (expo); + + if (MPFR_UNLIKELY (!mpfr_fits_ulong_p (f, rnd))) + { +@@ -44,10 +45,16 @@ + for (s = ULONG_MAX, prec = 0; s != 0; s /= 2, prec ++) + { } + ++ MPFR_SAVE_EXPO_MARK (expo); ++ + /* first round to prec bits */ + mpfr_init2 (x, prec); + mpfr_rint (x, f, rnd); + ++ /* The flags from mpfr_rint are the wanted ones. In particular, ++ it sets the inexact flag when necessary. */ ++ MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags); ++ + /* warning: if x=0, taking its exponent is illegal */ + if (MPFR_IS_ZERO(x)) + s = 0; +@@ -61,5 +68,7 @@ + + mpfr_clear (x); + ++ MPFR_SAVE_EXPO_FREE (expo); ++ + return s; + } +diff -Naurd mpfr-3.1.6-a/src/get_uj.c mpfr-3.1.6-b/src/get_uj.c +--- mpfr-3.1.6-a/src/get_uj.c 2017-01-01 01:39:09.000000000 +0000 ++++ mpfr-3.1.6-b/src/get_uj.c 2017-10-26 13:55:51.208013252 +0000 +@@ -35,6 +35,7 @@ + uintmax_t r; + mpfr_prec_t prec; + mpfr_t x; ++ MPFR_SAVE_EXPO_DECL (expo); + + if (MPFR_UNLIKELY (!mpfr_fits_uintmax_p (f, rnd))) + { +@@ -50,12 +51,18 @@ + for (r = MPFR_UINTMAX_MAX, prec = 0; r != 0; r /= 2, prec++) + { } + +- /* Now, r = 0. */ ++ MPFR_ASSERTD (r == 0); ++ ++ MPFR_SAVE_EXPO_MARK (expo); + + mpfr_init2 (x, prec); + mpfr_rint (x, f, rnd); + MPFR_ASSERTN (MPFR_IS_FP (x)); + ++ /* The flags from mpfr_rint are the wanted ones. In particular, ++ it sets the inexact flag when necessary. */ ++ MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags); ++ + if (MPFR_NOTZERO (x)) + { + mp_limb_t *xp; +@@ -76,6 +83,8 @@ + + mpfr_clear (x); + ++ MPFR_SAVE_EXPO_FREE (expo); ++ + return r; + } + +diff -Naurd mpfr-3.1.6-a/src/get_z.c mpfr-3.1.6-b/src/get_z.c +--- mpfr-3.1.6-a/src/get_z.c 2017-01-01 01:39:09.000000000 +0000 ++++ mpfr-3.1.6-b/src/get_z.c 2017-10-26 13:55:51.208013252 +0000 +@@ -29,6 +29,7 @@ + int inex; + mpfr_t r; + mpfr_exp_t exp; ++ MPFR_SAVE_EXPO_DECL (expo); + + if (MPFR_UNLIKELY (MPFR_IS_SINGULAR (f))) + { +@@ -41,6 +42,8 @@ + return 0; + } + ++ MPFR_SAVE_EXPO_MARK (expo); ++ + exp = MPFR_GET_EXP (f); + /* if exp <= 0, then |f|<1, thus |o(f)|<=1 */ + MPFR_ASSERTN (exp < 0 || exp <= MPFR_PREC_MAX); +@@ -50,6 +53,11 @@ + MPFR_ASSERTN (inex != 1 && inex != -1); /* integral part of f is + representable in r */ + MPFR_ASSERTN (MPFR_IS_FP (r)); ++ ++ /* The flags from mpfr_rint are the wanted ones. In particular, ++ it sets the inexact flag when necessary. */ ++ MPFR_SAVE_EXPO_UPDATE_FLAGS (expo, __gmpfr_flags); ++ + exp = mpfr_get_z_2exp (z, r); + if (exp >= 0) + mpz_mul_2exp (z, z, exp); +@@ -57,5 +65,7 @@ + mpz_fdiv_q_2exp (z, z, -exp); + mpfr_clear (r); + ++ MPFR_SAVE_EXPO_FREE (expo); ++ + return inex; + } +diff -Naurd mpfr-3.1.6-a/src/mpfr.h mpfr-3.1.6-b/src/mpfr.h +--- mpfr-3.1.6-a/src/mpfr.h 2017-09-07 11:36:44.000000000 +0000 ++++ mpfr-3.1.6-b/src/mpfr.h 2017-10-26 13:55:51.232013138 +0000 +@@ -27,7 +27,7 @@ + #define MPFR_VERSION_MAJOR 3 + #define MPFR_VERSION_MINOR 1 + #define MPFR_VERSION_PATCHLEVEL 6 +-#define MPFR_VERSION_STRING "3.1.6" ++#define MPFR_VERSION_STRING "3.1.6-p1" + + /* Macros dealing with MPFR VERSION */ + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) +diff -Naurd mpfr-3.1.6-a/src/version.c mpfr-3.1.6-b/src/version.c +--- mpfr-3.1.6-a/src/version.c 2017-09-07 11:36:44.000000000 +0000 ++++ mpfr-3.1.6-b/src/version.c 2017-10-26 13:55:51.232013138 +0000 +@@ -25,5 +25,5 @@ + const char * + mpfr_get_version (void) + { +- return "3.1.6"; ++ return "3.1.6-p1"; + } diff --git a/rev11982.patch b/rev11982.patch new file mode 100644 index 0000000..6bf8322 --- /dev/null +++ b/rev11982.patch @@ -0,0 +1,111 @@ +diff -Naurd mpfr-3.1.6-a/PATCHES mpfr-3.1.6-b/PATCHES +--- mpfr-3.1.6-a/PATCHES 2017-12-15 12:37:44.074256548 +0000 ++++ mpfr-3.1.6-b/PATCHES 2017-12-15 12:37:44.146256304 +0000 +@@ -0,0 +1 @@ ++root +diff -Naurd mpfr-3.1.6-a/VERSION mpfr-3.1.6-b/VERSION +--- mpfr-3.1.6-a/VERSION 2017-10-26 13:55:51.236013121 +0000 ++++ mpfr-3.1.6-b/VERSION 2017-12-15 12:37:44.142256319 +0000 +@@ -1 +1 @@ +-3.1.6-p1 ++3.1.6-p2 +diff -Naurd mpfr-3.1.6-a/src/mpfr.h mpfr-3.1.6-b/src/mpfr.h +--- mpfr-3.1.6-a/src/mpfr.h 2017-10-26 13:55:51.232013138 +0000 ++++ mpfr-3.1.6-b/src/mpfr.h 2017-12-15 12:37:44.142256319 +0000 +@@ -27,7 +27,7 @@ + #define MPFR_VERSION_MAJOR 3 + #define MPFR_VERSION_MINOR 1 + #define MPFR_VERSION_PATCHLEVEL 6 +-#define MPFR_VERSION_STRING "3.1.6-p1" ++#define MPFR_VERSION_STRING "3.1.6-p2" + + /* Macros dealing with MPFR VERSION */ + #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) +diff -Naurd mpfr-3.1.6-a/src/root.c mpfr-3.1.6-b/src/root.c +--- mpfr-3.1.6-a/src/root.c 2017-01-01 01:39:09.000000000 +0000 ++++ mpfr-3.1.6-b/src/root.c 2017-12-15 12:37:44.118256398 +0000 +@@ -107,6 +107,11 @@ + MPFR_RET_NAN; + } + ++ /* Special case |x| = 1. Note that if x = -1, then k is odd ++ (NaN results have already been filtered), so that y = -1. */ ++ if (mpfr_cmpabs (x, __gmpfr_one) == 0) ++ return mpfr_set (y, x, rnd_mode); ++ + /* General case */ + + /* For large k, use exp(log(x)/k). The threshold of 100 seems to be quite +@@ -188,6 +193,14 @@ + Assume all special cases have been eliminated before. + In the extended exponent range, overflows/underflows are not possible. + Assume x > 0, or x < 0 and k odd. ++ Also assume |x| <> 1 because log(1) = 0, which does not have an exponent ++ and would yield a failure in the error bound computation. A priori, this ++ constraint is quite artificial because if |x| is close enough to 1, then ++ the exponent of log|x| does not need to be used (in the code, err would ++ be 1 in such a domain). So this constraint |x| <> 1 could be avoided in ++ the code. However, this is an exact case easy to detect, so that such a ++ change would be useless. Values very close to 1 are not an issue, since ++ an underflow is not possible before the MPFR_GET_EXP. + */ + static int + mpfr_root_aux (mpfr_ptr y, mpfr_srcptr x, unsigned long k, mpfr_rnd_t rnd_mode) +@@ -219,7 +232,8 @@ + mpfr_log (t, absx, MPFR_RNDN); + /* t = log|x| * (1 + theta) with |theta| <= 2^(-w) */ + mpfr_div_ui (t, t, k, MPFR_RNDN); +- expt = MPFR_GET_EXP (t); ++ /* No possible underflow in mpfr_log and mpfr_div_ui. */ ++ expt = MPFR_GET_EXP (t); /* assumes t <> 0 */ + /* t = log|x|/k * (1 + theta) + eps with |theta| <= 2^(-w) + and |eps| <= 1/2 ulp(t), thus the total error is bounded + by 1.5 * 2^(expt - w) */ +diff -Naurd mpfr-3.1.6-a/src/version.c mpfr-3.1.6-b/src/version.c +--- mpfr-3.1.6-a/src/version.c 2017-10-26 13:55:51.232013138 +0000 ++++ mpfr-3.1.6-b/src/version.c 2017-12-15 12:37:44.142256319 +0000 +@@ -25,5 +25,5 @@ + const char * + mpfr_get_version (void) + { +- return "3.1.6-p1"; ++ return "3.1.6-p2"; + } +diff -Naurd mpfr-3.1.6-a/tests/troot.c mpfr-3.1.6-b/tests/troot.c +--- mpfr-3.1.6-a/tests/troot.c 2017-01-01 01:39:09.000000000 +0000 ++++ mpfr-3.1.6-b/tests/troot.c 2017-12-15 12:37:44.118256398 +0000 +@@ -405,6 +405,26 @@ + mpfr_clears (x, y1, y2, (mpfr_ptr) 0); + } + ++static void ++bug20171214 (void) ++{ ++ mpfr_t x, y; ++ int inex; ++ ++ mpfr_init2 (x, 805); ++ mpfr_init2 (y, 837); ++ mpfr_set_ui (x, 1, MPFR_RNDN); ++ inex = mpfr_root (y, x, 120, MPFR_RNDN); ++ MPFR_ASSERTN (inex == 0); ++ MPFR_ASSERTN (mpfr_cmp_ui (y, 1) == 0); ++ mpfr_set_si (x, -1, MPFR_RNDN); ++ inex = mpfr_root (y, x, 121, MPFR_RNDN); ++ MPFR_ASSERTN (inex == 0); ++ MPFR_ASSERTN (mpfr_cmp_si (y, -1) == 0); ++ mpfr_clear (x); ++ mpfr_clear (y); ++} ++ + int + main (void) + { +@@ -415,6 +435,7 @@ + + tests_start_mpfr (); + ++ bug20171214 (); + exact_powers (3, 1000); + special (); + bigint (); diff --git a/sources b/sources index 3cc9763..470faba 100644 --- a/sources +++ b/sources @@ -1 +1 @@ -c4ac246cf9795a4491e7766002cd528f mpfr-3.1.5.tar.xz +SHA512 (mpfr-3.1.6.tar.xz) = 746ee74d5026f267f74ab352d850ed30ff627d530aa840c71b24793e44875f8503946bd7399905dea2b2dd5744326254d7889337fe94cfe58d03c4066e9d8054