diff options
| author | Britney Fransen <brfransen@gmail.com> | 2018-09-06 16:35:27 (GMT) | 
|---|---|---|
| committer | Britney Fransen <brfransen@gmail.com> | 2018-09-06 16:35:27 (GMT) | 
| commit | 5669815ec3a539cf7b5ac7d8da2cbba3aeff44be (patch) | |
| tree | f13051093a52f47f5954c2ee2a783bc2f0f62f96 /abs/core/mpfr | |
| parent | 8d35f28049488f2585ef765bf48e7a58958fd587 (diff) | |
| parent | 04697136037cb5341ee6c051f8aaa265c0400c82 (diff) | |
| download | linhes_pkgbuild-5669815ec3a539cf7b5ac7d8da2cbba3aeff44be.zip linhes_pkgbuild-5669815ec3a539cf7b5ac7d8da2cbba3aeff44be.tar.gz linhes_pkgbuild-5669815ec3a539cf7b5ac7d8da2cbba3aeff44be.tar.bz2 | |
Merge branch 'testing'
Diffstat (limited to 'abs/core/mpfr')
| -rw-r--r-- | abs/core/mpfr/PKGBUILD | 33 | ||||
| -rw-r--r-- | abs/core/mpfr/mpfr-3.1.0.p10.patch | 1896 | ||||
| -rw-r--r-- | abs/core/mpfr/mpfr-3.1.6-p1.patch | 285 | ||||
| -rw-r--r-- | abs/core/mpfr/mpfr.install | 20 | 
4 files changed, 300 insertions, 1934 deletions
| diff --git a/abs/core/mpfr/PKGBUILD b/abs/core/mpfr/PKGBUILD index 4912c45..0f21bef 100644 --- a/abs/core/mpfr/PKGBUILD +++ b/abs/core/mpfr/PKGBUILD @@ -1,36 +1,33 @@ -# $Id: PKGBUILD 163011 2012-07-05 13:48:54Z allan $ +# $Id$  # Maintainer: Allan McRae <allan@archlinux.org>  # Contributor: damir <damir@archlinux.org>  pkgname=mpfr -_pkgver=3.1.1 -#_patchlevel=p1 -#pkgver=${_pkgver}.${_patchlevel} -pkgver=${_pkgver} +pkgver=4.0.1  pkgrel=1 -pkgdesc="Multiple-precision floating-point library" -arch=('i686' 'x86_64') -url="http://www.mpfr.org/" -license=('LGPL') +pkgdesc='Multiple-precision floating-point library' +arch=(x86_64) +url='http://www.mpfr.org/' +license=(LGPL)  depends=('gmp>=5.0') -options=('!libtool') -install=mpfr.install -source=(http://www.mpfr.org/mpfr-current/mpfr-${_pkgver}.tar.xz{,.asc}) -md5sums=('91d51c41fcf2799e4ee7a7126fc95c17' -         '91b187a2229211e543ba6fb82a079b2c') +source=(http://www.mpfr.org/mpfr-$pkgver/mpfr-${pkgver}.tar.xz{,.asc}) +validpgpkeys=('07F3DBBECC1A39605078094D980C197698C3739D') +sha256sums=('67874a60826303ee2fb6affc6dc0ddd3e749e9bfcb4c8655e3953d0458a6e16e' +            'SKIP')  build() { -  cd "${srcdir}/${pkgname}-${_pkgver}" +  cd $pkgname-$pkgver    ./configure --prefix=/usr --enable-thread-safe --enable-shared    make  }  check() { -  cd "${srcdir}/${pkgname}-${_pkgver}" +  cd $pkgname-$pkgver    make check +  make check-exported-symbols  }  package() { -  cd "${srcdir}/${pkgname}-${_pkgver}" -  make DESTDIR="${pkgdir}" install +  cd $pkgname-$pkgver +  make DESTDIR="$pkgdir" install  } diff --git a/abs/core/mpfr/mpfr-3.1.0.p10.patch b/abs/core/mpfr/mpfr-3.1.0.p10.patch deleted file mode 100644 index 0073be7..0000000 --- a/abs/core/mpfr/mpfr-3.1.0.p10.patch +++ /dev/null @@ -1,1896 +0,0 @@ -diff -Naurd mpfr-3.1.0-a/PATCHES mpfr-3.1.0-b/PATCHES ---- mpfr-3.1.0-a/PATCHES	2011-10-05 21:39:57.000000000 +0000 -+++ mpfr-3.1.0-b/PATCHES	2011-10-05 21:39:57.000000000 +0000 -@@ -0,0 +1 @@ -+mpfr_unlikely -diff -Naurd mpfr-3.1.0-a/VERSION mpfr-3.1.0-b/VERSION ---- mpfr-3.1.0-a/VERSION	2011-10-03 08:17:15.000000000 +0000 -+++ mpfr-3.1.0-b/VERSION	2011-10-05 21:39:57.000000000 +0000 -@@ -1 +1 @@ --3.1.0 -+3.1.0-p1 -diff -Naurd mpfr-3.1.0-a/src/mpfr-impl.h mpfr-3.1.0-b/src/mpfr-impl.h ---- mpfr-3.1.0-a/src/mpfr-impl.h	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr-impl.h	2011-10-05 21:39:57.000000000 +0000 -@@ -988,10 +988,11 @@ -  ******************************************************/ -  - /* Theses macros help the compiler to determine if a test is -- * likely or unlikely. */ -+   likely or unlikely. The !! is necessary in case x is larger -+   than a long. */ - #if __MPFR_GNUC(3,0) || __MPFR_ICC(8,1,0) - # define MPFR_LIKELY(x) (__builtin_expect(!!(x),1)) --# define MPFR_UNLIKELY(x) (__builtin_expect((x),0)) -+# define MPFR_UNLIKELY(x) (__builtin_expect(!!(x),0)) - #else - # define MPFR_LIKELY(x) (x) - # define MPFR_UNLIKELY(x) (x) -diff -Naurd mpfr-3.1.0-a/src/mpfr.h mpfr-3.1.0-b/src/mpfr.h ---- mpfr-3.1.0-a/src/mpfr.h	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr.h	2011-10-05 21:39:57.000000000 +0000 -@@ -27,7 +27,7 @@ - #define MPFR_VERSION_MAJOR 3 - #define MPFR_VERSION_MINOR 1 - #define MPFR_VERSION_PATCHLEVEL 0 --#define MPFR_VERSION_STRING "3.1.0" -+#define MPFR_VERSION_STRING "3.1.0-p1" -  - /* Macros dealing with MPFR VERSION */ - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) -diff -Naurd mpfr-3.1.0-a/src/version.c mpfr-3.1.0-b/src/version.c ---- mpfr-3.1.0-a/src/version.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/version.c	2011-10-05 21:39:57.000000000 +0000 -@@ -25,5 +25,5 @@ - const char * - mpfr_get_version (void) - { --  return "3.1.0"; -+  return "3.1.0-p1"; - } -diff -Naurd mpfr-3.1.0-a/PATCHES mpfr-3.1.0-b/PATCHES ---- mpfr-3.1.0-a/PATCHES	2011-10-14 10:43:32.000000000 +0000 -+++ mpfr-3.1.0-b/PATCHES	2011-10-14 10:43:32.000000000 +0000 -@@ -0,0 +1 @@ -+lib-search-path -diff -Naurd mpfr-3.1.0-a/VERSION mpfr-3.1.0-b/VERSION ---- mpfr-3.1.0-a/VERSION	2011-10-05 21:39:57.000000000 +0000 -+++ mpfr-3.1.0-b/VERSION	2011-10-14 10:43:32.000000000 +0000 -@@ -1 +1 @@ --3.1.0-p1 -+3.1.0-p2 -diff -Naurd mpfr-3.1.0-a/src/mpfr.h mpfr-3.1.0-b/src/mpfr.h ---- mpfr-3.1.0-a/src/mpfr.h	2011-10-05 21:39:57.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr.h	2011-10-14 10:43:32.000000000 +0000 -@@ -27,7 +27,7 @@ - #define MPFR_VERSION_MAJOR 3 - #define MPFR_VERSION_MINOR 1 - #define MPFR_VERSION_PATCHLEVEL 0 --#define MPFR_VERSION_STRING "3.1.0-p1" -+#define MPFR_VERSION_STRING "3.1.0-p2" -  - /* Macros dealing with MPFR VERSION */ - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) -diff -Naurd mpfr-3.1.0-a/src/version.c mpfr-3.1.0-b/src/version.c ---- mpfr-3.1.0-a/src/version.c	2011-10-05 21:39:57.000000000 +0000 -+++ mpfr-3.1.0-b/src/version.c	2011-10-14 10:43:32.000000000 +0000 -@@ -25,5 +25,5 @@ - const char * - mpfr_get_version (void) - { --  return "3.1.0-p1"; -+  return "3.1.0-p2"; - } -diff -Naurd mpfr-3.1.0-a/tests/Makefile.am mpfr-3.1.0-b/tests/Makefile.am ---- mpfr-3.1.0-a/tests/Makefile.am	2011-10-03 08:17:14.000000000 +0000 -+++ mpfr-3.1.0-b/tests/Makefile.am	2011-10-03 08:17:14.000000000 +0000 -@@ -65,8 +65,24 @@ - TESTS = $(check_PROGRAMS) - TESTS_ENVIRONMENT = MPFR_QUIET=1 $(VALGRIND) -  --# Option to prevent libtool from generating wrapper scripts for the tests. -+# The -no-install option prevents libtool from generating wrapper scripts -+# for the tests. - # This is useful to easily run the test scripts under valgrind or gdb. - # See discussion http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/28033 - # http://article.gmane.org/gmane.comp.lib.gnulib.bugs/28140 in particular. --AM_LDFLAGS = -no-install -+# -+# The -L$(top_builddir)/src/.libs option is necessary for some platforms, -+# such as HP-UX, when --with-gmp or --with-gmp-lib is used and an old MPFR -+# library is already installed in the corresponding lib directory: its -+# purpose is to make sure that the local .libs comes first in the library -+# search path (otherwise the tests are linked against the old MPFR library -+# by the LINK command -- see the generated Makefile). See: -+#   http://websympa.loria.fr/wwsympa/arc/mpfr/2011-10/msg00042.html -+#   http://websympa.loria.fr/wwsympa/arc/mpfr/2011-10/msg00043.html -+#   http://websympa.loria.fr/wwsympa/arc/mpfr/2011-10/msg00044.html -+#   http://websympa.loria.fr/wwsympa/arc/mpfr/2011-10/msg00066.html -+#   http://websympa.loria.fr/wwsympa/arc/mpfr/2011-10/msg00065.html -+# and -+#   http://debbugs.gnu.org/cgi/bugreport.cgi?bug=9728 -+# -+AM_LDFLAGS = -no-install -L$(top_builddir)/src/.libs -diff -Naurd mpfr-3.1.0-a/tests/Makefile.in mpfr-3.1.0-b/tests/Makefile.in ---- mpfr-3.1.0-a/tests/Makefile.in	2011-10-03 08:17:35.000000000 +0000 -+++ mpfr-3.1.0-b/tests/Makefile.in	2011-10-03 08:17:35.000000000 +0000 -@@ -1124,11 +1124,27 @@ - TESTS = $(check_PROGRAMS) - TESTS_ENVIRONMENT = MPFR_QUIET=1 $(VALGRIND) -  --# Option to prevent libtool from generating wrapper scripts for the tests. -+# The -no-install option prevents libtool from generating wrapper scripts -+# for the tests. - # This is useful to easily run the test scripts under valgrind or gdb. - # See discussion http://thread.gmane.org/gmane.comp.lib.gnulib.bugs/28033 - # http://article.gmane.org/gmane.comp.lib.gnulib.bugs/28140 in particular. --AM_LDFLAGS = -no-install -+# -+# The -L$(top_builddir)/src/.libs option is necessary for some platforms, -+# such as HP-UX, when --with-gmp or --with-gmp-lib is used and an old MPFR -+# library is already installed in the corresponding lib directory: its -+# purpose is to make sure that the local .libs comes first in the library -+# search path (otherwise the tests are linked against the old MPFR library -+# by the LINK command -- see the generated Makefile). See: -+#   http://websympa.loria.fr/wwsympa/arc/mpfr/2011-10/msg00042.html -+#   http://websympa.loria.fr/wwsympa/arc/mpfr/2011-10/msg00043.html -+#   http://websympa.loria.fr/wwsympa/arc/mpfr/2011-10/msg00044.html -+#   http://websympa.loria.fr/wwsympa/arc/mpfr/2011-10/msg00066.html -+#   http://websympa.loria.fr/wwsympa/arc/mpfr/2011-10/msg00065.html -+# and -+#   http://debbugs.gnu.org/cgi/bugreport.cgi?bug=9728 -+# -+AM_LDFLAGS = -no-install -L$(top_builddir)/src/.libs - all: all-am -  - .SUFFIXES: -diff -Naurd mpfr-3.1.0-a/PATCHES mpfr-3.1.0-b/PATCHES ---- mpfr-3.1.0-a/PATCHES	2011-11-03 15:15:11.000000000 +0000 -+++ mpfr-3.1.0-b/PATCHES	2011-11-03 15:15:11.000000000 +0000 -@@ -0,0 +1 @@ -+vasprintf -diff -Naurd mpfr-3.1.0-a/VERSION mpfr-3.1.0-b/VERSION ---- mpfr-3.1.0-a/VERSION	2011-10-14 10:43:32.000000000 +0000 -+++ mpfr-3.1.0-b/VERSION	2011-11-03 15:15:11.000000000 +0000 -@@ -1 +1 @@ --3.1.0-p2 -+3.1.0-p3 -diff -Naurd mpfr-3.1.0-a/src/mpfr.h mpfr-3.1.0-b/src/mpfr.h ---- mpfr-3.1.0-a/src/mpfr.h	2011-10-14 10:43:32.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr.h	2011-11-03 15:15:11.000000000 +0000 -@@ -27,7 +27,7 @@ - #define MPFR_VERSION_MAJOR 3 - #define MPFR_VERSION_MINOR 1 - #define MPFR_VERSION_PATCHLEVEL 0 --#define MPFR_VERSION_STRING "3.1.0-p2" -+#define MPFR_VERSION_STRING "3.1.0-p3" -  - /* Macros dealing with MPFR VERSION */ - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) -diff -Naurd mpfr-3.1.0-a/src/vasprintf.c mpfr-3.1.0-b/src/vasprintf.c ---- mpfr-3.1.0-a/src/vasprintf.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/vasprintf.c	2011-11-03 15:15:11.000000000 +0000 -@@ -1178,7 +1178,7 @@ -   mpfr_exp_t exp; -   char * str; -   const int spec_g = (spec.spec == 'g' || spec.spec == 'G'); --  const int keep_trailing_zeros = spec_g && spec.alt; -+  const int keep_trailing_zeros = !spec_g || spec.alt; -  -   /* WARNING: an empty precision field is forbidden (it means precision = 6 -      and it should have been changed to 6 before the function call) */ -@@ -1356,7 +1356,7 @@ -   else -     /* 1 <= |p| */ -     { --      size_t nsd;  /* Number of significant digits */ -+      size_t str_len; -  -       /* Determine the position of the most significant decimal digit. */ -       exp = floor_log10 (p); -@@ -1365,12 +1365,10 @@ -         /* P is too large to print all its integral part digits */ -         return -1; -  --      np->ip_size = exp + 1; -- --      nsd = spec.prec + np->ip_size; -       if (dec_info == NULL) --        { --          str = mpfr_get_str (NULL, &exp, 10, nsd, p, spec.rnd_mode); -+        { /* this case occurs with mpfr_printf ("%.0RUf", x) with x=9.5 */ -+          str = -+            mpfr_get_str (NULL, &exp, 10, spec.prec+exp+1, p, spec.rnd_mode); -           register_string (np->sl, str); -         } -       else -@@ -1379,81 +1377,60 @@ -           str = dec_info->str; -         } -       np->ip_ptr = MPFR_IS_NEG (p) ? ++str : str; /* skip sign */ -+      str_len = strlen (str); -+ -+      /* integral part */ -+      if (exp > str_len) -+        /* mpfr_get_str gives no trailing zero when p is rounded up to the next -+           power of 10 (p integer, so no fractional part) */ -+        { -+          np->ip_trailing_zeros = exp - str_len; -+          np->ip_size = str_len; -+        } -+      else -+        np->ip_size = exp; -  -       if (spec.group) -         /* thousands separator in integral part */ -         np->thousands_sep = MPFR_THOUSANDS_SEPARATOR; -  --      if (nsd == 0 || (spec_g && !spec.alt)) --        /* compute how much non-zero digits in integral and fractional --           parts */ -+      /* fractional part */ -+      str += np->ip_size; -+      str_len -= np->ip_size; -+      if (!keep_trailing_zeros) -+        /* remove trailing zeros, if any */ -         { --          size_t str_len; --          str_len = strlen (str); /* note: the sign has been skipped */ -- --          if (exp > str_len) --            /* mpfr_get_str doesn't give the trailing zeros when p is a --               multiple of 10 (p integer, so no fractional part) */ --            { --              np->ip_trailing_zeros = exp - str_len; --              np->ip_size = str_len; --              if (spec.alt) --                np->point = MPFR_DECIMAL_POINT; --            } --          else --            /* str may contain some digits which are in fractional part */ -+          char *ptr = str + str_len - 1; /* pointer to the last digit of -+                                            str */ -+          while ((*ptr == '0') && (str_len != 0)) -             { --              char *ptr; -- --              ptr = str + str_len - 1; /* points to the end of str */ --              str_len -= np->ip_size;  /* number of digits in fractional --                                          part */ -- --              if (!keep_trailing_zeros) --                /* remove trailing zeros, if any */ --                { --                  while ((*ptr == '0') && (str_len != 0)) --                    { --                      --ptr; --                      --str_len; --                    } --                } -- --              if (str_len > INT_MAX) --                /* too many digits in fractional part */ --                return -1; -- --              if (str_len != 0) --                /* some digits in fractional part */ --                { --                  np->point = MPFR_DECIMAL_POINT; --                  np->fp_ptr = str + np->ip_size; --                  np->fp_size = str_len; --                } -+              --ptr; -+              --str_len; -             } -         } --      else --        /* spec.prec digits in fractional part */ -+ -+      if (str_len > 0) -+        /* some nonzero digits in fractional part */ -         { --          if (np->ip_size == exp - 1) --            /* the absolute value of the number has been rounded up to a power --               of ten. --               Insert an additional zero in integral part and put the rest of --               them in fractional part. */ --            np->ip_trailing_zeros = 1; -+          if (str_len > INT_MAX) -+            /* too many digits in fractional part */ -+            return -1; -  --          if (spec.prec != 0) --            { --              MPFR_ASSERTD (np->ip_size + np->ip_trailing_zeros == exp); --              MPFR_ASSERTD (np->ip_size + spec.prec == nsd); -+          np->point = MPFR_DECIMAL_POINT; -+          np->fp_ptr = str; -+          np->fp_size = str_len; -+        } -  --              np->point = MPFR_DECIMAL_POINT; --              np->fp_ptr = str + np->ip_size; --              np->fp_size = spec.prec; --            } --          else if (spec.alt) --            np->point = MPFR_DECIMAL_POINT; -+      if (keep_trailing_zeros && str_len < spec.prec) -+        /* add missing trailing zeros */ -+        { -+          np->point = MPFR_DECIMAL_POINT; -+          np->fp_trailing_zeros = spec.prec - np->fp_size; -         } -+ -+      if (spec.alt) -+        /* add decimal point even if no digits follow it */ -+        np->point = MPFR_DECIMAL_POINT; -     } -  -   return 0; -diff -Naurd mpfr-3.1.0-a/src/version.c mpfr-3.1.0-b/src/version.c ---- mpfr-3.1.0-a/src/version.c	2011-10-14 10:43:32.000000000 +0000 -+++ mpfr-3.1.0-b/src/version.c	2011-11-03 15:15:11.000000000 +0000 -@@ -25,5 +25,5 @@ - const char * - mpfr_get_version (void) - { --  return "3.1.0-p2"; -+  return "3.1.0-p3"; - } -diff -Naurd mpfr-3.1.0-a/tests/tsprintf.c mpfr-3.1.0-b/tests/tsprintf.c ---- mpfr-3.1.0-a/tests/tsprintf.c	2011-10-03 08:17:14.000000000 +0000 -+++ mpfr-3.1.0-b/tests/tsprintf.c	2011-11-03 15:15:11.000000000 +0000 -@@ -475,6 +475,18 @@ -   check_sprintf ("-1.", "%- #0.1RG", x); -  -   /* precision zero */ -+  mpfr_set_d (x, 9.5, MPFR_RNDN); -+  check_sprintf ("9",    "%.0RDf", x); -+  check_sprintf ("10",    "%.0RUf", x); -+ -+  mpfr_set_d (x, 19.5, MPFR_RNDN); -+  check_sprintf ("19",    "%.0RDf", x); -+  check_sprintf ("20",    "%.0RUf", x); -+ -+  mpfr_set_d (x, 99.5, MPFR_RNDN); -+  check_sprintf ("99",    "%.0RDf", x); -+  check_sprintf ("100",   "%.0RUf", x); -+ -   mpfr_set_d (x, -9.5, MPFR_RNDN); -   check_sprintf ("-10",    "%.0RDf", x); -   check_sprintf ("-10",    "%.0RYf", x); -@@ -1078,6 +1090,23 @@ -   mpfr_clear (x); - } -  -+static void -+bug20111102 (void) -+{ -+  mpfr_t t; -+  char s[100]; -+ -+  mpfr_init2 (t, 84); -+  mpfr_set_str (t, "999.99999999999999999999", 10, MPFR_RNDN); -+  mpfr_sprintf (s, "%.20RNg", t); -+  if (strcmp (s, "1000") != 0) -+    { -+      printf ("Error in bug20111102, expected 1000, got %s\n", s); -+      exit (1); -+    } -+  mpfr_clear (t); -+} -+ - /* In particular, the following test makes sure that the rounding -  * for %Ra and %Rb is not done on the MPFR number itself (as it -  * would overflow). Note: it has been reported on comp.std.c that -@@ -1161,6 +1190,7 @@ -   locale = setlocale (LC_ALL, "C"); - #endif -  -+  bug20111102 (); -   native_types (); -   hexadecimal (); -   binary (); -diff -Naurd mpfr-3.1.0-a/PATCHES mpfr-3.1.0-b/PATCHES ---- mpfr-3.1.0-a/PATCHES	2011-11-28 12:22:52.000000000 +0000 -+++ mpfr-3.1.0-b/PATCHES	2011-11-28 12:22:52.000000000 +0000 -@@ -0,0 +1 @@ -+gmp41compat -diff -Naurd mpfr-3.1.0-a/VERSION mpfr-3.1.0-b/VERSION ---- mpfr-3.1.0-a/VERSION	2011-11-03 15:15:11.000000000 +0000 -+++ mpfr-3.1.0-b/VERSION	2011-11-28 12:22:52.000000000 +0000 -@@ -1 +1 @@ --3.1.0-p3 -+3.1.0-p4 -diff -Naurd mpfr-3.1.0-a/doc/mpfr.info mpfr-3.1.0-b/doc/mpfr.info ---- mpfr-3.1.0-a/doc/mpfr.info	2011-10-03 09:43:04.000000000 +0000 -+++ mpfr-3.1.0-b/doc/mpfr.info	2011-11-28 12:22:52.000000000 +0000 -@@ -2994,11 +2994,12 @@ -  -    * `mpfr_urandom' and `mpfr_urandomb' changed in MPFR 3.1.  Their -      behavior no longer depends on the platform (assuming this is also --     true for GMP's random generator).  As a consequence, the returned --     values can be different between MPFR 3.1 and previous MPFR --     versions.  Note: as the reproducibility of these functions was not --     specified before MPFR 3.1, the MPFR 3.1 behavior is _not_ regarded --     as backward incompatible with previous versions. -+     true for GMP's random generator, which is not the case between GMP -+     4.1 and 4.2 if `gmp_randinit_default' is used).  As a consequence, -+     the returned values can be different between MPFR 3.1 and previous -+     MPFR versions.  Note: as the reproducibility of these functions -+     was not specified before MPFR 3.1, the MPFR 3.1 behavior is _not_ -+     regarded as backward incompatible with previous versions. -  -  -  -@@ -4239,13 +4240,13 @@ - Node: Type and Macro Changes129308 - Node: Added Functions132029 - Node: Changed Functions134972 --Node: Removed Functions139167 --Node: Other Changes139579 --Node: Contributors141108 --Node: References143574 --Node: GNU Free Documentation License145315 --Node: Concept Index167758 --Node: Function and Type Index173677 -+Node: Removed Functions139253 -+Node: Other Changes139665 -+Node: Contributors141194 -+Node: References143660 -+Node: GNU Free Documentation License145401 -+Node: Concept Index167844 -+Node: Function and Type Index173763 -  - End Tag Table -  -diff -Naurd mpfr-3.1.0-a/doc/mpfr.texi mpfr-3.1.0-b/doc/mpfr.texi ---- mpfr-3.1.0-a/doc/mpfr.texi	2011-10-03 08:17:14.000000000 +0000 -+++ mpfr-3.1.0-b/doc/mpfr.texi	2011-11-28 12:22:52.000000000 +0000 -@@ -3466,8 +3466,9 @@ - a lack of specification. -  - @item @code{mpfr_urandom} and @code{mpfr_urandomb} changed in MPFR 3.1. --Their behavior no longer depends on the platform (assuming this is also --true for GMP's random generator).  As a consequence, the returned values -+Their behavior no longer depends on the platform (assuming this is also true -+for GMP's random generator, which is not the case between GMP 4.1 and 4.2 if -+@code{gmp_randinit_default} is used).  As a consequence, the returned values - can be different between MPFR 3.1 and previous MPFR versions. - Note: as the reproducibility of these functions was not specified - before MPFR 3.1, the MPFR 3.1 behavior is @emph{not} regarded as -diff -Naurd mpfr-3.1.0-a/src/mpfr.h mpfr-3.1.0-b/src/mpfr.h ---- mpfr-3.1.0-a/src/mpfr.h	2011-11-03 15:15:11.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr.h	2011-11-28 12:22:52.000000000 +0000 -@@ -27,7 +27,7 @@ - #define MPFR_VERSION_MAJOR 3 - #define MPFR_VERSION_MINOR 1 - #define MPFR_VERSION_PATCHLEVEL 0 --#define MPFR_VERSION_STRING "3.1.0-p3" -+#define MPFR_VERSION_STRING "3.1.0-p4" -  - /* Macros dealing with MPFR VERSION */ - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) -diff -Naurd mpfr-3.1.0-a/src/version.c mpfr-3.1.0-b/src/version.c ---- mpfr-3.1.0-a/src/version.c	2011-11-03 15:15:11.000000000 +0000 -+++ mpfr-3.1.0-b/src/version.c	2011-11-28 12:22:52.000000000 +0000 -@@ -25,5 +25,5 @@ - const char * - mpfr_get_version (void) - { --  return "3.1.0-p3"; -+  return "3.1.0-p4"; - } -diff -Naurd mpfr-3.1.0-a/tests/trandom.c mpfr-3.1.0-b/tests/trandom.c ---- mpfr-3.1.0-a/tests/trandom.c	2011-10-03 08:17:14.000000000 +0000 -+++ mpfr-3.1.0-b/tests/trandom.c	2011-11-28 12:22:52.000000000 +0000 -@@ -114,21 +114,29 @@ -   mpfr_t x; -   gmp_randstate_t s; -  -+#if __MPFR_GMP(4,2,0) -+# define C1 "0.895943" -+# define C2 "0.848824" -+#else -+# define C1 "0.479652" -+# define C2 "0.648529" -+#endif -+ -   gmp_randinit_default (s); -   gmp_randseed_ui (s, 42); -   mpfr_init2 (x, 17); -   mpfr_urandomb (x, s); --  if (mpfr_cmp_str1 (x, "0.895943") != 0) -+  if (mpfr_cmp_str1 (x, C1) != 0) -     { --      printf ("Error in bug20100914, expected 0.895943, got "); -+      printf ("Error in bug20100914, expected " C1 ", got "); -       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); -       printf ("\n"); -       exit (1); -     } -   mpfr_urandomb (x, s); --  if (mpfr_cmp_str1 (x, "0.848824") != 0) -+  if (mpfr_cmp_str1 (x, C2) != 0) -     { --      printf ("Error in bug20100914, expected 0.848824, got "); -+      printf ("Error in bug20100914, expected " C2 ", got "); -       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); -       printf ("\n"); -       exit (1); -diff -Naurd mpfr-3.1.0-a/tests/turandom.c mpfr-3.1.0-b/tests/turandom.c ---- mpfr-3.1.0-a/tests/turandom.c	2011-10-03 08:17:14.000000000 +0000 -+++ mpfr-3.1.0-b/tests/turandom.c	2011-11-28 12:22:52.000000000 +0000 -@@ -160,23 +160,29 @@ -   mpfr_t x; -   gmp_randstate_t s; -  -+#if __MPFR_GMP(4,2,0) -+# define C1 "0.8488312" -+# define C2 "0.8156509" -+#else -+# define C1 "0.6485367" -+# define C2 "0.9362717" -+#endif -+ -   gmp_randinit_default (s); -   gmp_randseed_ui (s, 42); -   mpfr_init2 (x, 17); -   mpfr_urandom (x, s, MPFR_RNDN); --  /* the following values are obtained on a 32-bit computer, we should get --     the same values on a 64-bit computer */ --  if (mpfr_cmp_str1 (x, "0.8488312") != 0) -+  if (mpfr_cmp_str1 (x, C1) != 0) -     { --      printf ("Error in bug20100914, expected 0.8488312, got "); -+      printf ("Error in bug20100914, expected " C1 ", got "); -       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); -       printf ("\n"); -       exit (1); -     } -   mpfr_urandom (x, s, MPFR_RNDN); --  if (mpfr_cmp_str1 (x, "0.8156509") != 0) -+  if (mpfr_cmp_str1 (x, C2) != 0) -     { --      printf ("Error in bug20100914, expected 0.8156509, got "); -+      printf ("Error in bug20100914, expected " C2 ", got "); -       mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); -       printf ("\n"); -       exit (1); -diff -Naurd mpfr-3.1.0-a/PATCHES mpfr-3.1.0-b/PATCHES ---- mpfr-3.1.0-a/PATCHES	2012-02-24 12:44:49.000000000 +0000 -+++ mpfr-3.1.0-b/PATCHES	2012-02-24 12:44:49.000000000 +0000 -@@ -0,0 +1 @@ -+logging-freeze -diff -Naurd mpfr-3.1.0-a/VERSION mpfr-3.1.0-b/VERSION ---- mpfr-3.1.0-a/VERSION	2011-11-28 12:22:52.000000000 +0000 -+++ mpfr-3.1.0-b/VERSION	2012-02-24 12:44:49.000000000 +0000 -@@ -1 +1 @@ --3.1.0-p4 -+3.1.0-p5 -diff -Naurd mpfr-3.1.0-a/src/add_d.c mpfr-3.1.0-b/src/add_d.c ---- mpfr-3.1.0-a/src/add_d.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/add_d.c	2012-02-24 12:44:49.000000000 +0000 -@@ -34,7 +34,7 @@ -     (("b[%Pu]=%.*Rg c=%.20g rnd=%d", -       mpfr_get_prec(b), mpfr_log_prec, b, c, rnd_mode), -      ("a[%Pu]=%.*Rg inexact=%d", --      mpfr_get_prec (a), mpfr_get_prec, a, inexact)); -+      mpfr_get_prec (a), mpfr_log_prec, a, inexact)); -  -   MPFR_SAVE_EXPO_MARK (expo); -  -diff -Naurd mpfr-3.1.0-a/src/add_ui.c mpfr-3.1.0-b/src/add_ui.c ---- mpfr-3.1.0-a/src/add_ui.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/add_ui.c	2012-02-24 12:44:49.000000000 +0000 -@@ -29,7 +29,7 @@ -   MPFR_LOG_FUNC -     (("x[%Pu]=%.*Rg u=%d rnd=%d", -       mpfr_get_prec(x), mpfr_log_prec, x, u, rnd_mode), --     ("y[%Pu]=%.*Rg", mpfr_get_prec (y), mpfr_get_prec, y)); -+     ("y[%Pu]=%.*Rg", mpfr_get_prec (y), mpfr_log_prec, y)); -  -   if (MPFR_LIKELY(u != 0) )  /* if u=0, do nothing */ -     { -diff -Naurd mpfr-3.1.0-a/src/mpfr.h mpfr-3.1.0-b/src/mpfr.h ---- mpfr-3.1.0-a/src/mpfr.h	2011-11-28 12:22:52.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr.h	2012-02-24 12:44:49.000000000 +0000 -@@ -27,7 +27,7 @@ - #define MPFR_VERSION_MAJOR 3 - #define MPFR_VERSION_MINOR 1 - #define MPFR_VERSION_PATCHLEVEL 0 --#define MPFR_VERSION_STRING "3.1.0-p4" -+#define MPFR_VERSION_STRING "3.1.0-p5" -  - /* Macros dealing with MPFR VERSION */ - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) -diff -Naurd mpfr-3.1.0-a/src/mul_d.c mpfr-3.1.0-b/src/mul_d.c ---- mpfr-3.1.0-a/src/mul_d.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/mul_d.c	2012-02-24 12:44:49.000000000 +0000 -@@ -34,7 +34,7 @@ -     (("b[%Pu]=%.*Rg c=%.20g rnd=%d", -       mpfr_get_prec(b), mpfr_log_prec, b, c, rnd_mode), -      ("a[%Pu]=%.*Rg inexact=%d", --      mpfr_get_prec (a), mpfr_get_prec, a, inexact)); -+      mpfr_get_prec (a), mpfr_log_prec, a, inexact)); -  -   MPFR_SAVE_EXPO_MARK (expo); -  -diff -Naurd mpfr-3.1.0-a/src/version.c mpfr-3.1.0-b/src/version.c ---- mpfr-3.1.0-a/src/version.c	2011-11-28 12:22:52.000000000 +0000 -+++ mpfr-3.1.0-b/src/version.c	2012-02-24 12:44:49.000000000 +0000 -@@ -25,5 +25,5 @@ - const char * - mpfr_get_version (void) - { --  return "3.1.0-p4"; -+  return "3.1.0-p5"; - } -diff -Naurd mpfr-3.1.0-a/PATCHES mpfr-3.1.0-b/PATCHES ---- mpfr-3.1.0-a/PATCHES	2012-02-24 13:50:05.000000000 +0000 -+++ mpfr-3.1.0-b/PATCHES	2012-02-24 13:50:05.000000000 +0000 -@@ -0,0 +1 @@ -+logging-varfmt -diff -Naurd mpfr-3.1.0-a/VERSION mpfr-3.1.0-b/VERSION ---- mpfr-3.1.0-a/VERSION	2012-02-24 12:44:49.000000000 +0000 -+++ mpfr-3.1.0-b/VERSION	2012-02-24 13:50:05.000000000 +0000 -@@ -1 +1 @@ --3.1.0-p5 -+3.1.0-p6 -diff -Naurd mpfr-3.1.0-a/src/mpfr-impl.h mpfr-3.1.0-b/src/mpfr-impl.h ---- mpfr-3.1.0-a/src/mpfr-impl.h	2011-10-05 21:39:57.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr-impl.h	2012-02-24 13:50:05.000000000 +0000 -@@ -1592,7 +1592,7 @@ -   do                                                                    \ -     if ((MPFR_LOG_INTERNAL_F & mpfr_log_type) &&                        \ -         (mpfr_log_current <= mpfr_log_level))                           \ --      LOG_PRINT ("%s.%d:%s[%#Pu]=%.*Rf\n", __func__, __LINE__,          \ -+      LOG_PRINT ("%s.%d:%s[%#Pu]=%.*Rg\n", __func__, __LINE__,          \ -                  #x, mpfr_get_prec (x), mpfr_log_prec, x);              \ -   while (0) -  -diff -Naurd mpfr-3.1.0-a/src/mpfr.h mpfr-3.1.0-b/src/mpfr.h ---- mpfr-3.1.0-a/src/mpfr.h	2012-02-24 12:44:49.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr.h	2012-02-24 13:50:05.000000000 +0000 -@@ -27,7 +27,7 @@ - #define MPFR_VERSION_MAJOR 3 - #define MPFR_VERSION_MINOR 1 - #define MPFR_VERSION_PATCHLEVEL 0 --#define MPFR_VERSION_STRING "3.1.0-p5" -+#define MPFR_VERSION_STRING "3.1.0-p6" -  - /* Macros dealing with MPFR VERSION */ - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) -diff -Naurd mpfr-3.1.0-a/src/version.c mpfr-3.1.0-b/src/version.c ---- mpfr-3.1.0-a/src/version.c	2012-02-24 12:44:49.000000000 +0000 -+++ mpfr-3.1.0-b/src/version.c	2012-02-24 13:50:05.000000000 +0000 -@@ -25,5 +25,5 @@ - const char * - mpfr_get_version (void) - { --  return "3.1.0-p5"; -+  return "3.1.0-p6"; - } -diff -Naurd mpfr-3.1.0-a/PATCHES mpfr-3.1.0-b/PATCHES ---- mpfr-3.1.0-a/PATCHES	2012-03-08 15:17:03.000000000 +0000 -+++ mpfr-3.1.0-b/PATCHES	2012-03-08 15:17:03.000000000 +0000 -@@ -0,0 +1 @@ -+large-prec -diff -Naurd mpfr-3.1.0-a/VERSION mpfr-3.1.0-b/VERSION ---- mpfr-3.1.0-a/VERSION	2012-02-24 13:50:05.000000000 +0000 -+++ mpfr-3.1.0-b/VERSION	2012-03-08 15:17:03.000000000 +0000 -@@ -1 +1 @@ --3.1.0-p6 -+3.1.0-p7 -diff -Naurd mpfr-3.1.0-a/src/add1.c mpfr-3.1.0-b/src/add1.c ---- mpfr-3.1.0-a/src/add1.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/add1.c	2012-03-08 15:17:03.000000000 +0000 -@@ -44,12 +44,12 @@ -   bq = MPFR_PREC(b); -   cq = MPFR_PREC(c); -  --  an = (aq-1)/GMP_NUMB_BITS+1; /* number of limbs of a */ -+  an = MPFR_PREC2LIMBS (aq); /* number of limbs of a */ -   aq2 = (mpfr_prec_t) an * GMP_NUMB_BITS; -   sh = aq2 - aq;                  /* non-significant bits in low limb */ -  --  bn = (bq-1)/GMP_NUMB_BITS+1; /* number of limbs of b */ --  cn = (cq-1)/GMP_NUMB_BITS+1; /* number of limbs of c */ -+  bn = MPFR_PREC2LIMBS (bq); /* number of limbs of b */ -+  cn = MPFR_PREC2LIMBS (cq); /* number of limbs of c */ -  -   ap = MPFR_MANT(a); -   bp = MPFR_MANT(b); -@@ -124,7 +124,7 @@ -       dif = aq2 - diff_exp; -       /* dif is the number of bits of c which overlap with a' */ -  --      difn = (dif-1)/GMP_NUMB_BITS + 1; -+      difn = MPFR_PREC2LIMBS (dif); -       /* only the highest difn limbs from c have to be considered */ -       if (MPFR_UNLIKELY(difn > cn)) -         { -diff -Naurd mpfr-3.1.0-a/src/add1sp.c mpfr-3.1.0-b/src/add1sp.c ---- mpfr-3.1.0-a/src/add1sp.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/add1sp.c	2012-03-08 15:17:03.000000000 +0000 -@@ -107,7 +107,7 @@ -  -   /* Read prec and num of limbs */ -   p = MPFR_PREC(b); --  n = (p+GMP_NUMB_BITS-1)/GMP_NUMB_BITS; -+  n = MPFR_PREC2LIMBS (p); -   MPFR_UNSIGNED_MINUS_MODULO(sh, p); -   bx = MPFR_GET_EXP(b); -   d = (mpfr_uexp_t) (bx - MPFR_GET_EXP(c)); -diff -Naurd mpfr-3.1.0-a/src/agm.c mpfr-3.1.0-b/src/agm.c ---- mpfr-3.1.0-a/src/agm.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/agm.c	2012-03-08 15:17:03.000000000 +0000 -@@ -91,7 +91,7 @@ -   q = MPFR_PREC(r); -   p = q + MPFR_INT_CEIL_LOG2(q) + 15; -   MPFR_ASSERTD (p >= 7); /* see algorithms.tex */ --  s = (p - 1) / GMP_NUMB_BITS + 1; -+  s = MPFR_PREC2LIMBS (p); -  -   /* b (op2) and a (op1) are the 2 operands but we want b >= a */ -   compare = mpfr_cmp (op1, op2); -@@ -285,7 +285,7 @@ -  -       /* Next iteration */ -       MPFR_ZIV_NEXT (loop, p); --      s = (p - 1) / GMP_NUMB_BITS + 1; -+      s = MPFR_PREC2LIMBS (p); -     } -   MPFR_ZIV_FREE (loop); -  -diff -Naurd mpfr-3.1.0-a/src/eq.c mpfr-3.1.0-b/src/eq.c ---- mpfr-3.1.0-a/src/eq.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/eq.c	2012-03-08 15:17:03.000000000 +0000 -@@ -56,8 +56,8 @@ -   if (uexp != vexp) -     return 0; /* no bit agree */ -  --  usize = (MPFR_PREC(u) - 1) / GMP_NUMB_BITS + 1; --  vsize = (MPFR_PREC(v) - 1) / GMP_NUMB_BITS + 1; -+  usize = MPFR_LIMB_SIZE (u); -+  vsize = MPFR_LIMB_SIZE (v); -  -   if (vsize > usize) /* exchange u and v */ -     { -diff -Naurd mpfr-3.1.0-a/src/exp.c mpfr-3.1.0-b/src/exp.c ---- mpfr-3.1.0-a/src/exp.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/exp.c	2012-03-08 15:17:03.000000000 +0000 -@@ -133,7 +133,7 @@ -               mp_size_t yn; -               int sh; -  --              yn = 1 + (MPFR_PREC(y) - 1) / GMP_NUMB_BITS; -+              yn = MPFR_LIMB_SIZE (y); -               sh = (mpfr_prec_t) yn * GMP_NUMB_BITS - MPFR_PREC(y); -               MPFR_MANT(y)[0] += MPFR_LIMB_ONE << sh; -               inexact = 1; -diff -Naurd mpfr-3.1.0-a/src/get_d.c mpfr-3.1.0-b/src/get_d.c ---- mpfr-3.1.0-a/src/get_d.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/get_d.c	2012-03-08 15:17:03.000000000 +0000 -@@ -100,7 +100,7 @@ -           nbits += (1021 + e); -           MPFR_ASSERTD (nbits >= 1); -         } --      np = (nbits + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS; -+      np = MPFR_PREC2LIMBS (nbits); -       MPFR_ASSERTD ( np <= MPFR_LIMBS_PER_DOUBLE ); -       carry = mpfr_round_raw_4 (tp, MPFR_MANT(src), MPFR_PREC(src), negative, -                                 nbits, rnd_mode); -diff -Naurd mpfr-3.1.0-a/src/get_flt.c mpfr-3.1.0-b/src/get_flt.c ---- mpfr-3.1.0-a/src/get_flt.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/get_flt.c	2012-03-08 15:17:03.000000000 +0000 -@@ -92,7 +92,7 @@ -           nbits += (125 + e); -           MPFR_ASSERTD (nbits >= 1); -         } --      np = (nbits + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS; -+      np = MPFR_PREC2LIMBS (nbits); -       MPFR_ASSERTD(np <= MPFR_LIMBS_PER_FLT); -       carry = mpfr_round_raw_4 (tp, MPFR_MANT(src), MPFR_PREC(src), negative, -                                 nbits, rnd_mode); -diff -Naurd mpfr-3.1.0-a/src/get_str.c mpfr-3.1.0-b/src/get_str.c ---- mpfr-3.1.0-a/src/get_str.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/get_str.c	2012-03-08 15:17:03.000000000 +0000 -@@ -2351,7 +2351,7 @@ -  -       /* the first digit will contain only r bits */ -       prec = (m - 1) * pow2 + r; /* total number of bits */ --      n = (prec - 1) / GMP_NUMB_BITS + 1; -+      n = MPFR_PREC2LIMBS (prec); -  -       MPFR_TMP_MARK (marker); -       x1 = MPFR_TMP_LIMBS_ALLOC (n + 1); -@@ -2417,12 +2417,12 @@ -       exact = 1; -  -       /* number of limbs */ --      n = 1 + (prec - 1) / GMP_NUMB_BITS; -+      n = MPFR_PREC2LIMBS (prec); -  -       /* a will contain the approximation of the mantissa */ -       a = MPFR_TMP_LIMBS_ALLOC (n); -  --      nx = 1 + (MPFR_PREC(x) - 1) / GMP_NUMB_BITS; -+      nx = MPFR_LIMB_SIZE (x); -  -       if ((mpfr_exp_t) m == g) /* final exponent is 0, no multiplication or -                                 division to perform */ -diff -Naurd mpfr-3.1.0-a/src/init2.c mpfr-3.1.0-b/src/init2.c ---- mpfr-3.1.0-a/src/init2.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/init2.c	2012-03-08 15:17:03.000000000 +0000 -@@ -51,7 +51,7 @@ -      which both have an odd mantissa */ -   MPFR_ASSERTN(p >= MPFR_PREC_MIN && p <= MPFR_PREC_MAX); -  --  xsize = (mp_size_t) ((p - 1) / GMP_NUMB_BITS) + 1; -+  xsize = MPFR_PREC2LIMBS (p); -   tmp   = (mpfr_limb_ptr) (*__gmp_allocate_func)(MPFR_MALLOC_SIZE(xsize)); -  -   MPFR_PREC(x) = p;                /* Set prec */ -diff -Naurd mpfr-3.1.0-a/src/lngamma.c mpfr-3.1.0-b/src/lngamma.c ---- mpfr-3.1.0-a/src/lngamma.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/lngamma.c	2012-03-08 15:17:03.000000000 +0000 -@@ -67,7 +67,7 @@ -  -   /* Now, the unit bit is represented. */ -  --  prec = ((prec - 1) / GMP_NUMB_BITS + 1) * GMP_NUMB_BITS - expo; -+  prec = MPFR_PREC2LIMBS (prec) * GMP_NUMB_BITS - expo; -   /* number of represented fractional bits (including the trailing 0's) */ -  -   x0 = *(MPFR_MANT (x) + prec / GMP_NUMB_BITS); -diff -Naurd mpfr-3.1.0-a/src/mpfr-impl.h mpfr-3.1.0-b/src/mpfr-impl.h ---- mpfr-3.1.0-a/src/mpfr-impl.h	2012-02-24 13:50:05.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr-impl.h	2012-03-09 12:06:26.000000000 +0000 -@@ -646,10 +646,24 @@ -  **************** mpfr_t properties ******************* -  ******************************************************/ -  -+/* In the following macro, p is usually a mpfr_prec_t, but this macro -+   works with other integer types (without integer overflow). Checking -+   that p >= 1 in debug mode is useful here because this macro can be -+   used on a computed precision (in particular, this formula does not -+   work for a degenerate case p = 0, and could give different results -+   on different platforms). But let us not use an assertion checking -+   in the MPFR_LAST_LIMB() and MPFR_LIMB_SIZE() macros below to avoid -+   too much expansion for assertions (in practice, this should be a -+   problem just when testing MPFR with the --enable-assert configure -+   option and the -ansi -pedantic-errors gcc compiler flags). */ -+#define MPFR_PREC2LIMBS(p) \ -+  (MPFR_ASSERTD ((p) >= 1), ((p) - 1) / GMP_NUMB_BITS + 1) -+ - #define MPFR_PREC(x)      ((x)->_mpfr_prec) - #define MPFR_EXP(x)       ((x)->_mpfr_exp) - #define MPFR_MANT(x)      ((x)->_mpfr_d) --#define MPFR_LIMB_SIZE(x) ((MPFR_PREC((x))-1)/GMP_NUMB_BITS+1) -+#define MPFR_LAST_LIMB(x) ((MPFR_PREC (x) - 1) / GMP_NUMB_BITS) -+#define MPFR_LIMB_SIZE(x) (MPFR_LAST_LIMB (x) + 1) -  -  - /****************************************************** -@@ -749,7 +763,8 @@ - #define MPFR_IS_FP(x)       (!MPFR_IS_NAN(x) && !MPFR_IS_INF(x)) - #define MPFR_IS_SINGULAR(x) (MPFR_EXP(x) <= MPFR_EXP_INF) - #define MPFR_IS_PURE_FP(x)  (!MPFR_IS_SINGULAR(x) && \ --  (MPFR_ASSERTD (MPFR_MANT(x)[MPFR_LIMB_SIZE(x)-1] & MPFR_LIMB_HIGHBIT), 1)) -+  (MPFR_ASSERTD ((MPFR_MANT(x)[MPFR_LAST_LIMB(x)]  \ -+                  & MPFR_LIMB_HIGHBIT) != 0), 1)) -  - #define MPFR_ARE_SINGULAR(x,y) \ -   (MPFR_UNLIKELY(MPFR_IS_SINGULAR(x)) || MPFR_UNLIKELY(MPFR_IS_SINGULAR(y))) -@@ -1061,7 +1076,7 @@ - /* Set a number to 1 (Fast) - It doesn't check if 1 is in the exponent range */ - #define MPFR_SET_ONE(x)                                               \ - do {                                                                  \ --  mp_size_t _size = MPFR_LIMB_SIZE(x) - 1;                            \ -+  mp_size_t _size = MPFR_LAST_LIMB(x);                                \ -   MPFR_SET_POS(x);                                                    \ -   MPFR_EXP(x) = 1;                                                    \ -   MPN_ZERO ( MPFR_MANT(x), _size);                                    \ -@@ -1213,8 +1228,8 @@ -     _destp = MPFR_MANT (dest);                                              \ -     if (MPFR_UNLIKELY (_destprec >= _srcprec))                              \ -       {                                                                     \ --        _srcs  = (_srcprec  + GMP_NUMB_BITS-1)/GMP_NUMB_BITS;               \ --        _dests = (_destprec + GMP_NUMB_BITS-1)/GMP_NUMB_BITS - _srcs;       \ -+        _srcs  = MPFR_PREC2LIMBS (_srcprec);                                \ -+        _dests = MPFR_PREC2LIMBS (_destprec) - _srcs;                       \ -         MPN_COPY (_destp + _dests, srcp, _srcs);                            \ -         MPN_ZERO (_destp, _dests);                                          \ -         inexact = 0;                                                        \ -@@ -1227,8 +1242,8 @@ -         mp_limb_t _rb, _sb, _ulp;                                           \ -                                                                             \ -         /* Compute Position and shift */                                    \ --        _srcs  = (_srcprec  + GMP_NUMB_BITS-1)/GMP_NUMB_BITS;               \ --        _dests = (_destprec + GMP_NUMB_BITS-1)/GMP_NUMB_BITS;               \ -+        _srcs  = MPFR_PREC2LIMBS (_srcprec);                                \ -+        _dests = MPFR_PREC2LIMBS (_destprec);                               \ -         MPFR_UNSIGNED_MINUS_MODULO (_sh, _destprec);                        \ -         _sp = (srcp) + _srcs - _dests;                                      \ -                                                                             \ -@@ -1372,7 +1387,7 @@ -       if (MPFR_LIKELY (MPFR_PREC (dest) == MPFR_PREC (src)))            \ -         {                                                               \ -           MPN_COPY (MPFR_MANT (dest), MPFR_MANT (src),                  \ --                    (MPFR_PREC (src) + GMP_NUMB_BITS-1)/GMP_NUMB_BITS); \ -+                    MPFR_LIMB_SIZE (src));                              \ -           inexact = 0;                                                  \ -         }                                                               \ -       else                                                              \ -@@ -1682,7 +1697,7 @@ -  MPFR_ASSERTD (_prec >= MPFR_PREC_MIN);                                 \ -  if (MPFR_UNLIKELY (_prec > MPFR_PREC_MAX))                             \ -    mpfr_abort_prec_max ();                                              \ -- _size = (mpfr_prec_t) (_prec + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS;     \ -+ _size = MPFR_PREC2LIMBS (_prec);                                       \ -  if (MPFR_UNLIKELY (_size * (num) > MPFR_GROUP_STATIC_SIZE))            \ -    {                                                                    \ -      (g).alloc = (num) * _size * sizeof (mp_limb_t);                    \ -@@ -1733,7 +1748,7 @@ -  MPFR_ASSERTD (_prec >= MPFR_PREC_MIN);                                 \ -  if (MPFR_UNLIKELY (_prec > MPFR_PREC_MAX))                             \ -    mpfr_abort_prec_max ();                                              \ -- _size = (mpfr_prec_t) (_prec + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS;     \ -+ _size = MPFR_PREC2LIMBS (_prec);                                       \ -  (g).alloc = (num) * _size * sizeof (mp_limb_t);                        \ -  if (MPFR_LIKELY (_oalloc == 0))                                        \ -    (g).mant = (mp_limb_t *) (*__gmp_allocate_func) ((g).alloc);         \ -@@ -1886,7 +1901,7 @@ -        MPFR_NORETURN_ATTR; -  - __MPFR_DECLSPEC void mpfr_rand_raw _MPFR_PROTO((mpfr_limb_ptr, gmp_randstate_t, --                                                unsigned long)); -+                                                mpfr_prec_t)); -  - __MPFR_DECLSPEC mpz_t* mpfr_bernoulli_internal _MPFR_PROTO((mpz_t*, -                                                             unsigned long)); -diff -Naurd mpfr-3.1.0-a/src/mpfr.h mpfr-3.1.0-b/src/mpfr.h ---- mpfr-3.1.0-a/src/mpfr.h	2012-02-24 13:50:05.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr.h	2012-03-08 15:17:03.000000000 +0000 -@@ -27,7 +27,7 @@ - #define MPFR_VERSION_MAJOR 3 - #define MPFR_VERSION_MINOR 1 - #define MPFR_VERSION_PATCHLEVEL 0 --#define MPFR_VERSION_STRING "3.1.0-p6" -+#define MPFR_VERSION_STRING "3.1.0-p7" -  - /* Macros dealing with MPFR VERSION */ - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) -diff -Naurd mpfr-3.1.0-a/src/mul.c mpfr-3.1.0-b/src/mul.c ---- mpfr-3.1.0-a/src/mul.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/mul.c	2012-03-08 15:17:03.000000000 +0000 -@@ -93,15 +93,15 @@ -  -   ax = MPFR_GET_EXP (b) + MPFR_GET_EXP (c); -  --  bq = MPFR_PREC(b); --  cq = MPFR_PREC(c); -+  bq = MPFR_PREC (b); -+  cq = MPFR_PREC (c); -  --  MPFR_ASSERTD(bq+cq > bq); /* PREC_MAX is /2 so no integer overflow */ -+  MPFR_ASSERTN ((mpfr_uprec_t) bq + cq <= MPFR_PREC_MAX); -  --  bn = (bq+GMP_NUMB_BITS-1)/GMP_NUMB_BITS; /* number of limbs of b */ --  cn = (cq+GMP_NUMB_BITS-1)/GMP_NUMB_BITS; /* number of limbs of c */ -+  bn = MPFR_PREC2LIMBS (bq); /* number of limbs of b */ -+  cn = MPFR_PREC2LIMBS (cq); /* number of limbs of c */ -   k = bn + cn; /* effective nb of limbs used by b*c (= tn or tn+1) below */ --  tn = (bq + cq + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS; -+  tn = MPFR_PREC2LIMBS (bq + cq); -   /* <= k, thus no int overflow */ -   MPFR_ASSERTD(tn <= k); -  -@@ -292,12 +292,12 @@ -   bq = MPFR_PREC (b); -   cq = MPFR_PREC (c); -  --  MPFR_ASSERTD (bq+cq > bq); /* PREC_MAX is /2 so no integer overflow */ -+  MPFR_ASSERTN ((mpfr_uprec_t) bq + cq <= MPFR_PREC_MAX); -  --  bn = (bq+GMP_NUMB_BITS-1)/GMP_NUMB_BITS; /* number of limbs of b */ --  cn = (cq+GMP_NUMB_BITS-1)/GMP_NUMB_BITS; /* number of limbs of c */ -+  bn = MPFR_PREC2LIMBS (bq); /* number of limbs of b */ -+  cn = MPFR_PREC2LIMBS (cq); /* number of limbs of c */ -   k = bn + cn; /* effective nb of limbs used by b*c (= tn or tn+1) below */ --  tn = (bq + cq + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS; -+  tn = MPFR_PREC2LIMBS (bq + cq); -   MPFR_ASSERTD (tn <= k); /* tn <= k, thus no int overflow */ -  -   /* Check for no size_t overflow*/ -diff -Naurd mpfr-3.1.0-a/src/pow.c mpfr-3.1.0-b/src/pow.c ---- mpfr-3.1.0-a/src/pow.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/pow.c	2012-03-08 15:17:03.000000000 +0000 -@@ -136,7 +136,7 @@ -      (b) all the 'z' bits are zero -   */ -  --  prec = ((prec - 1) / GMP_NUMB_BITS + 1) * GMP_NUMB_BITS - expo; -+  prec = MPFR_PREC2LIMBS (prec) * GMP_NUMB_BITS - expo; -   /* number of z+0 bits */ -  -   yn = prec / GMP_NUMB_BITS; -diff -Naurd mpfr-3.1.0-a/src/print_raw.c mpfr-3.1.0-b/src/print_raw.c ---- mpfr-3.1.0-a/src/print_raw.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/print_raw.c	2012-03-08 15:17:03.000000000 +0000 -@@ -84,7 +84,7 @@ -   int i; -   mpfr_prec_t count = 0; -   char c; --  mp_size_t n = (r - 1) / GMP_NUMB_BITS + 1; -+  mp_size_t n = MPFR_PREC2LIMBS (r); -  -   printf("%s ", str); -   for(n-- ; n>=0 ; n--) -@@ -109,7 +109,7 @@ -   int i; -   mpfr_prec_t count = 0; -   char c; --  mp_size_t n = (r - 1) / GMP_NUMB_BITS + 1; -+  mp_size_t n = MPFR_PREC2LIMBS (r); -  -   for(n-- ; n>=0 ; n--) -     { -diff -Naurd mpfr-3.1.0-a/src/round_prec.c mpfr-3.1.0-b/src/round_prec.c ---- mpfr-3.1.0-a/src/round_prec.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/round_prec.c	2012-03-08 15:17:03.000000000 +0000 -@@ -55,12 +55,12 @@ -  -   MPFR_ASSERTN(prec >= MPFR_PREC_MIN && prec <= MPFR_PREC_MAX); -  --  nw = 1 + (prec - 1) / GMP_NUMB_BITS; /* needed allocated limbs */ -+  nw = MPFR_PREC2LIMBS (prec); /* needed allocated limbs */ -  -   /* check if x has enough allocated space for the significand */ -   /* Get the number of limbs from the precision. -      (Compatible with all allocation methods) */ --  ow = (MPFR_PREC (x) + GMP_NUMB_BITS - 1) / GMP_NUMB_BITS; -+  ow = MPFR_LIMB_SIZE (x); -   if (nw > ow) -     { -       /* FIXME: Variable can't be created using custom allocation, -diff -Naurd mpfr-3.1.0-a/src/round_raw_generic.c mpfr-3.1.0-b/src/round_raw_generic.c ---- mpfr-3.1.0-a/src/round_raw_generic.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/round_raw_generic.c	2012-03-08 15:17:03.000000000 +0000 -@@ -80,7 +80,7 @@ -       (xprec <= yprec || MPFR_IS_LIKE_RNDZ (rnd_mode, neg))) -     return 0; -  --  xsize = (xprec-1)/GMP_NUMB_BITS + 1; -+  xsize = MPFR_PREC2LIMBS (xprec); -   nw = yprec / GMP_NUMB_BITS; -   rw = yprec & (GMP_NUMB_BITS - 1); -  -diff -Naurd mpfr-3.1.0-a/src/set.c mpfr-3.1.0-b/src/set.c ---- mpfr-3.1.0-a/src/set.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/set.c	2012-03-08 15:17:03.000000000 +0000 -@@ -48,8 +48,7 @@ -       /* Same precision and b is not singular: -        * just copy the mantissa, and set the exponent and the sign -        * The result is exact. */ --      MPN_COPY (MPFR_MANT (a), MPFR_MANT (b), --                (MPFR_PREC (b) + GMP_NUMB_BITS-1)/GMP_NUMB_BITS); -+      MPN_COPY (MPFR_MANT (a), MPFR_MANT (b), MPFR_LIMB_SIZE (b)); -       MPFR_RET (0); -     } -   else -diff -Naurd mpfr-3.1.0-a/src/set_f.c mpfr-3.1.0-b/src/set_f.c ---- mpfr-3.1.0-a/src/set_f.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/set_f.c	2012-03-08 15:17:03.000000000 +0000 -@@ -43,7 +43,7 @@ -   if (SIZ(x) * MPFR_FROM_SIGN_TO_INT(MPFR_SIGN(y)) < 0) -     MPFR_CHANGE_SIGN (y); -  --  sy = 1 + (MPFR_PREC(y) - 1) / GMP_NUMB_BITS; -+  sy = MPFR_LIMB_SIZE (y); -   my = MPFR_MANT(y); -   mx = PTR(x); -  -diff -Naurd mpfr-3.1.0-a/src/set_prec.c mpfr-3.1.0-b/src/set_prec.c ---- mpfr-3.1.0-a/src/set_prec.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/set_prec.c	2012-03-08 15:17:03.000000000 +0000 -@@ -32,7 +32,7 @@ -   MPFR_ASSERTN (p >= MPFR_PREC_MIN && p <= MPFR_PREC_MAX); -  -   /* Calculate the new number of limbs */ --  xsize = (p - 1) / GMP_NUMB_BITS + 1; -+  xsize = MPFR_PREC2LIMBS (p); -  -   /* Realloc only if the new size is greater than the old */ -   xoldsize = MPFR_GET_ALLOC_SIZE (x); -diff -Naurd mpfr-3.1.0-a/src/setmax.c mpfr-3.1.0-b/src/setmax.c ---- mpfr-3.1.0-a/src/setmax.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/setmax.c	2012-03-08 15:17:03.000000000 +0000 -@@ -32,7 +32,7 @@ -   mp_limb_t *xp; -  -   MPFR_SET_EXP (x, e); --  xn = 1 + (MPFR_PREC(x) - 1) / GMP_NUMB_BITS; -+  xn = MPFR_LIMB_SIZE (x); -   sh = (mpfr_prec_t) xn * GMP_NUMB_BITS - MPFR_PREC(x); -   xp = MPFR_MANT(x); -   xp[0] = MP_LIMB_T_MAX << sh; -diff -Naurd mpfr-3.1.0-a/src/sqr.c mpfr-3.1.0-b/src/sqr.c ---- mpfr-3.1.0-a/src/sqr.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/sqr.c	2012-03-08 15:17:03.000000000 +0000 -@@ -56,11 +56,11 @@ -   ax = 2 * MPFR_GET_EXP (b); -   bq = MPFR_PREC(b); -  --  MPFR_ASSERTD (2 * bq > bq); /* PREC_MAX is /2 so no integer overflow */ -+  MPFR_ASSERTN (2 * (mpfr_uprec_t) bq <= MPFR_PREC_MAX); -  --  bn = MPFR_LIMB_SIZE(b); /* number of limbs of b */ --  tn = 1 + (2 * bq - 1) / GMP_NUMB_BITS; /* number of limbs of square, --                                               2*bn or 2*bn-1 */ -+  bn = MPFR_LIMB_SIZE (b); /* number of limbs of b */ -+  tn = MPFR_PREC2LIMBS (2 * bq); /* number of limbs of square, -+                                    2*bn or 2*bn-1 */ -  -   if (MPFR_UNLIKELY(bn > MPFR_SQR_THRESHOLD)) -     return mpfr_mul (a, b, b, rnd_mode); -diff -Naurd mpfr-3.1.0-a/src/stack_interface.c mpfr-3.1.0-b/src/stack_interface.c ---- mpfr-3.1.0-a/src/stack_interface.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/stack_interface.c	2012-03-08 15:17:03.000000000 +0000 -@@ -26,7 +26,7 @@ - size_t - mpfr_custom_get_size (mpfr_prec_t prec) - { --  return (prec + GMP_NUMB_BITS -1) / GMP_NUMB_BITS * BYTES_PER_MP_LIMB; -+  return MPFR_PREC2LIMBS (prec) * BYTES_PER_MP_LIMB; - } -  - #undef mpfr_custom_init -diff -Naurd mpfr-3.1.0-a/src/strtofr.c mpfr-3.1.0-b/src/strtofr.c ---- mpfr-3.1.0-a/src/strtofr.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/strtofr.c	2012-03-08 15:17:03.000000000 +0000 -@@ -467,7 +467,7 @@ -       /* Set y to the value of the ~prec most significant bits of pstr->mant -          (as long as we guarantee correct rounding, we don't need to get -          exactly prec bits). */ --      ysize = (prec - 1) / GMP_NUMB_BITS + 1; -+      ysize = MPFR_PREC2LIMBS (prec); -       /* prec bits corresponds to ysize limbs */ -       ysize_bits = ysize * GMP_NUMB_BITS; -       /* and to ysize_bits >= prec > MPFR_PREC (x) bits */ -diff -Naurd mpfr-3.1.0-a/src/sub1sp.c mpfr-3.1.0-b/src/sub1sp.c ---- mpfr-3.1.0-a/src/sub1sp.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/sub1sp.c	2012-03-08 15:17:03.000000000 +0000 -@@ -155,8 +155,8 @@ -   MPFR_ASSERTD(MPFR_IS_PURE_FP(c)); -  -   /* Read prec and num of limbs */ --  p = MPFR_PREC(b); --  n = (p-1)/GMP_NUMB_BITS+1; -+  p = MPFR_PREC (b); -+  n = MPFR_PREC2LIMBS (p); -  -   /* Fast cmp of |b| and |c|*/ -   bx = MPFR_GET_EXP (b); -diff -Naurd mpfr-3.1.0-a/src/urandomb.c mpfr-3.1.0-b/src/urandomb.c ---- mpfr-3.1.0-a/src/urandomb.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/urandomb.c	2012-03-08 15:17:03.000000000 +0000 -@@ -31,13 +31,20 @@ -    a sufficient number of limbs */ - void - mpfr_rand_raw (mpfr_limb_ptr mp, gmp_randstate_t rstate, --               unsigned long int nbits) -+               mpfr_prec_t nbits) - { -   mpz_t z; -  -+  MPFR_ASSERTN (nbits >= 1); -   /* To be sure to avoid the potential allocation of mpz_urandomb */ --  ALLOC(z) = SIZ(z) = ((nbits - 1) / GMP_NUMB_BITS) + 1; -+  ALLOC(z) = SIZ(z) = MPFR_PREC2LIMBS (nbits); -   PTR(z)   = mp; -+#if __MPFR_GMP(5,0,0) -+  /* Check for integer overflow (unless mp_bitcnt_t is signed, -+     but according to the GMP manual, this shouldn't happen). -+     Note: mp_bitcnt_t has been introduced in GMP 5.0.0. */ -+  MPFR_ASSERTN ((mp_bitcnt_t) -1 < 0 || nbits <= (mp_bitcnt_t) -1); -+#endif -   mpz_urandomb (z, rstate, nbits); - } -  -diff -Naurd mpfr-3.1.0-a/src/version.c mpfr-3.1.0-b/src/version.c ---- mpfr-3.1.0-a/src/version.c	2012-02-24 13:50:05.000000000 +0000 -+++ mpfr-3.1.0-b/src/version.c	2012-03-08 15:17:03.000000000 +0000 -@@ -25,5 +25,5 @@ - const char * - mpfr_get_version (void) - { --  return "3.1.0-p6"; -+  return "3.1.0-p7"; - } -diff -Naurd mpfr-3.1.0-a/tests/tinits.c mpfr-3.1.0-b/tests/tinits.c ---- mpfr-3.1.0-a/tests/tinits.c	2011-10-03 08:17:14.000000000 +0000 -+++ mpfr-3.1.0-b/tests/tinits.c	2012-03-08 15:17:03.000000000 +0000 -@@ -1,4 +1,4 @@ --/* Test file for mpfr_inits, mpfr_inits2 and mpfr_clears. -+/* Test file for mpfr_init2, mpfr_inits, mpfr_inits2 and mpfr_clears. -  - Copyright 2003, 2006, 2007, 2008, 2009, 2010, 2011 Free Software Foundation, Inc. - Contributed by the Arenaire and Caramel projects, INRIA. -@@ -20,18 +20,43 @@ - http://www.gnu.org/licenses/ or write to the Free Software Foundation, Inc., - 51 Franklin St, Fifth Floor, Boston, MA 02110-1301, USA. */ -  -+#include <stdlib.h> -+ - #include "mpfr-test.h" -  - int - main (void) - { -   mpfr_t a, b, c; -+  long large_prec; -  -   tests_start_mpfr (); -+ -   mpfr_inits (a, b, c, (mpfr_ptr) 0); -   mpfr_clears (a, b, c, (mpfr_ptr) 0); -   mpfr_inits2 (200, a, b, c, (mpfr_ptr) 0); -   mpfr_clears (a, b, c, (mpfr_ptr) 0); -+ -+  /* test for precision 2^31-1, see -+     https://gforge.inria.fr/tracker/index.php?func=detail&aid=13918 */ -+  large_prec = 2147483647; -+  if (getenv ("MPFR_CHECK_LARGEMEM") != NULL) -+    { -+      /* We assume that the precision won't be increased internally. */ -+      if (large_prec > MPFR_PREC_MAX) -+        large_prec = MPFR_PREC_MAX; -+      mpfr_inits2 (large_prec, a, b, (mpfr_ptr) 0); -+      mpfr_set_ui (a, 17, MPFR_RNDN); -+      mpfr_set (b, a, MPFR_RNDN); -+      if (mpfr_get_ui (a, MPFR_RNDN) != 17) -+        { -+          printf ("Error in mpfr_init2 with precision 2^31-1\n"); -+          exit (1); -+        } -+      mpfr_clears (a, b, (mpfr_ptr) 0); -+    } -+ -   tests_end_mpfr (); -+ -   return 0; - } -diff -Naurd mpfr-3.1.0-a/PATCHES mpfr-3.1.0-b/PATCHES ---- mpfr-3.1.0-a/PATCHES	2012-03-12 11:59:47.000000000 +0000 -+++ mpfr-3.1.0-b/PATCHES	2012-03-12 11:59:47.000000000 +0000 -@@ -0,0 +1 @@ -+__gmp_const -diff -Naurd mpfr-3.1.0-a/VERSION mpfr-3.1.0-b/VERSION ---- mpfr-3.1.0-a/VERSION	2012-03-08 15:17:03.000000000 +0000 -+++ mpfr-3.1.0-b/VERSION	2012-03-12 11:59:47.000000000 +0000 -@@ -1 +1 @@ --3.1.0-p7 -+3.1.0-p8 -diff -Naurd mpfr-3.1.0-a/src/mpfr.h mpfr-3.1.0-b/src/mpfr.h ---- mpfr-3.1.0-a/src/mpfr.h	2012-03-08 15:17:03.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr.h	2012-03-12 11:59:47.000000000 +0000 -@@ -27,7 +27,7 @@ - #define MPFR_VERSION_MAJOR 3 - #define MPFR_VERSION_MINOR 1 - #define MPFR_VERSION_PATCHLEVEL 0 --#define MPFR_VERSION_STRING "3.1.0-p7" -+#define MPFR_VERSION_STRING "3.1.0-p8" -  - /* Macros dealing with MPFR VERSION */ - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) -@@ -39,6 +39,18 @@ - # include <gmp.h> - #endif -  -+/* GMP's internal __gmp_const macro has been removed on 2012-03-04: -+     http://gmplib.org:8000/gmp/rev/d287cfaf6732 -+   const is standard and now assumed to be available. If the __gmp_const -+   definition is no longer present in GMP, this probably means that GMP -+   assumes that const is available; thus let's define it to const. -+   Note: this is a temporary fix that can be backported to previous MPFR -+   versions. In the future, __gmp_const should be replaced by const like -+   in GMP. */ -+#ifndef __gmp_const -+# define __gmp_const const -+#endif -+ - /* Avoid some problems with macro expansion if the user defines macros -    with the same name as keywords. By convention, identifiers and macro -    names starting with mpfr_ are reserved by MPFR. */ -diff -Naurd mpfr-3.1.0-a/src/version.c mpfr-3.1.0-b/src/version.c ---- mpfr-3.1.0-a/src/version.c	2012-03-08 15:17:03.000000000 +0000 -+++ mpfr-3.1.0-b/src/version.c	2012-03-12 11:59:47.000000000 +0000 -@@ -25,5 +25,5 @@ - const char * - mpfr_get_version (void) - { --  return "3.1.0-p7"; -+  return "3.1.0-p8"; - } -diff -Naurd mpfr-3.1.0-a/PATCHES mpfr-3.1.0-b/PATCHES ---- mpfr-3.1.0-a/PATCHES	2012-04-27 01:13:15.000000000 +0000 -+++ mpfr-3.1.0-b/PATCHES	2012-04-27 01:13:15.000000000 +0000 -@@ -0,0 +1 @@ -+gamma-underflow -diff -Naurd mpfr-3.1.0-a/VERSION mpfr-3.1.0-b/VERSION ---- mpfr-3.1.0-a/VERSION	2012-03-12 11:59:47.000000000 +0000 -+++ mpfr-3.1.0-b/VERSION	2012-04-27 01:13:15.000000000 +0000 -@@ -1 +1 @@ --3.1.0-p8 -+3.1.0-p9 -diff -Naurd mpfr-3.1.0-a/src/gamma.c mpfr-3.1.0-b/src/gamma.c ---- mpfr-3.1.0-a/src/gamma.c	2011-10-03 08:17:09.000000000 +0000 -+++ mpfr-3.1.0-b/src/gamma.c	2012-04-27 01:13:15.000000000 +0000 -@@ -296,7 +296,7 @@ -       /* we want an upper bound for x * [log(2-x)-1]. -          since x < 0, we need a lower bound on log(2-x) */ -       mpfr_ui_sub (xp, 2, x, MPFR_RNDD); --      mpfr_log2 (xp, xp, MPFR_RNDD); -+      mpfr_log (xp, xp, MPFR_RNDD); -       mpfr_sub_ui (xp, xp, 1, MPFR_RNDD); -       mpfr_mul (xp, xp, x, MPFR_RNDU); -  -diff -Naurd mpfr-3.1.0-a/src/mpfr.h mpfr-3.1.0-b/src/mpfr.h ---- mpfr-3.1.0-a/src/mpfr.h	2012-03-12 11:59:47.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr.h	2012-04-27 01:13:15.000000000 +0000 -@@ -27,7 +27,7 @@ - #define MPFR_VERSION_MAJOR 3 - #define MPFR_VERSION_MINOR 1 - #define MPFR_VERSION_PATCHLEVEL 0 --#define MPFR_VERSION_STRING "3.1.0-p8" -+#define MPFR_VERSION_STRING "3.1.0-p9" -  - /* Macros dealing with MPFR VERSION */ - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) -diff -Naurd mpfr-3.1.0-a/src/version.c mpfr-3.1.0-b/src/version.c ---- mpfr-3.1.0-a/src/version.c	2012-03-12 11:59:47.000000000 +0000 -+++ mpfr-3.1.0-b/src/version.c	2012-04-27 01:13:15.000000000 +0000 -@@ -25,5 +25,5 @@ - const char * - mpfr_get_version (void) - { --  return "3.1.0-p8"; -+  return "3.1.0-p9"; - } -diff -Naurd mpfr-3.1.0-a/tests/tgamma.c mpfr-3.1.0-b/tests/tgamma.c ---- mpfr-3.1.0-a/tests/tgamma.c	2011-10-03 08:17:14.000000000 +0000 -+++ mpfr-3.1.0-b/tests/tgamma.c	2012-04-27 01:13:15.000000000 +0000 -@@ -478,6 +478,36 @@ -   mpfr_clear (x); - } -  -+/* bug found by Giridhar Tammana */ -+static void -+test20120426 (void) -+{ -+  mpfr_t xa, xb; -+  int i; -+  mpfr_exp_t emin; -+ -+  mpfr_init2 (xa, 53); -+  mpfr_init2 (xb, 53); -+  mpfr_set_d (xb, -168.5, MPFR_RNDN); -+  emin = mpfr_get_emin (); -+  mpfr_set_emin (-1073); -+  i = mpfr_gamma (xa, xb, MPFR_RNDN); -+  i = mpfr_subnormalize (xa, i, MPFR_RNDN); /* new ternary value */ -+  mpfr_set_str (xb, "-9.5737343987585366746184749943e-304", 10, MPFR_RNDN); -+  if (!((i > 0) && (mpfr_cmp (xa, xb) == 0))) -+    { -+      printf ("Error in test20120426, i=%d\n", i); -+      printf ("expected "); -+      mpfr_print_binary (xb); putchar ('\n'); -+      printf ("got      "); -+      mpfr_print_binary (xa); putchar ('\n'); -+      exit (1); -+    } -+  mpfr_set_emin (emin); -+  mpfr_clear (xa); -+  mpfr_clear (xb); -+} -+ - static void - exprange (void) - { -@@ -821,6 +851,7 @@ -   gamma_integer (); -   test20071231 (); -   test20100709 (); -+  test20120426 (); -  -   data_check ("data/gamma", mpfr_gamma, "mpfr_gamma"); -  -diff -Naurd mpfr-3.1.0-a/PATCHES mpfr-3.1.0-b/PATCHES ---- mpfr-3.1.0-a/PATCHES	2012-05-07 18:52:45.000000000 +0000 -+++ mpfr-3.1.0-b/PATCHES	2012-05-07 18:52:45.000000000 +0000 -@@ -0,0 +1 @@ -+gamma-overunderflow -diff -Naurd mpfr-3.1.0-a/VERSION mpfr-3.1.0-b/VERSION ---- mpfr-3.1.0-a/VERSION	2012-04-27 01:13:15.000000000 +0000 -+++ mpfr-3.1.0-b/VERSION	2012-05-07 18:52:45.000000000 +0000 -@@ -1 +1 @@ --3.1.0-p9 -+3.1.0-p10 -diff -Naurd mpfr-3.1.0-a/src/gamma.c mpfr-3.1.0-b/src/gamma.c ---- mpfr-3.1.0-a/src/gamma.c	2012-04-27 01:13:15.000000000 +0000 -+++ mpfr-3.1.0-b/src/gamma.c	2012-05-07 18:52:45.000000000 +0000 -@@ -100,7 +100,8 @@ -   mpfr_t xp, GammaTrial, tmp, tmp2; -   mpz_t fact; -   mpfr_prec_t realprec; --  int compared, inex, is_integer; -+  int compared, is_integer; -+  int inex = 0;  /* 0 means: result gamma not set yet */ -   MPFR_GROUP_DECL (group); -   MPFR_SAVE_EXPO_DECL (expo); -   MPFR_ZIV_DECL (loop); -@@ -377,6 +378,15 @@ -       mpfr_mul (GammaTrial, tmp2, xp, MPFR_RNDN); /* Pi*(2-x), error (1+u)^2 */ -       err_g = MPFR_GET_EXP(GammaTrial); -       mpfr_sin (GammaTrial, GammaTrial, MPFR_RNDN); /* sin(Pi*(2-x)) */ -+      /* If tmp is +Inf, we compute exp(lngamma(x)). */ -+      if (mpfr_inf_p (tmp)) -+        { -+          inex = mpfr_explgamma (gamma, x, &expo, tmp, tmp2, rnd_mode); -+          if (inex) -+            goto end; -+          else -+            goto ziv_next; -+        } -       err_g = err_g + 1 - MPFR_GET_EXP(GammaTrial); -       /* let g0 the true value of Pi*(2-x), g the computed value. -          We have g = g0 + h with |h| <= |(1+u^2)-1|*g. -@@ -411,11 +421,16 @@ -       if (MPFR_LIKELY (MPFR_CAN_ROUND (GammaTrial, realprec - err_g, -                                        MPFR_PREC(gamma), rnd_mode))) -         break; -+ -+    ziv_next: -       MPFR_ZIV_NEXT (loop, realprec); -     } -+ -+ end: -   MPFR_ZIV_FREE (loop); -  --  inex = mpfr_set (gamma, GammaTrial, rnd_mode); -+  if (inex == 0) -+    inex = mpfr_set (gamma, GammaTrial, rnd_mode); -   MPFR_GROUP_CLEAR (group); -   mpz_clear (fact); -  -diff -Naurd mpfr-3.1.0-a/src/lngamma.c mpfr-3.1.0-b/src/lngamma.c ---- mpfr-3.1.0-a/src/lngamma.c	2012-03-08 15:17:03.000000000 +0000 -+++ mpfr-3.1.0-b/src/lngamma.c	2012-05-07 18:52:45.000000000 +0000 -@@ -49,9 +49,72 @@ -     mpfr_set_ui_2exp (s, 9, -1, MPFR_RNDN); /* 4.5 */ - } -  --#ifndef IS_GAMMA -+#ifdef IS_GAMMA -+ -+/* This function is called in case of intermediate overflow/underflow. -+   The s1 and s2 arguments are temporary MPFR numbers, having the -+   working precision. If the result could be determined, then the -+   flags are updated via pexpo, y is set to the result, and the -+   (non-zero) ternary value is returned. Otherwise 0 is returned -+   in order to perform the next Ziv iteration. */ - static int --unit_bit (mpfr_srcptr (x)) -+mpfr_explgamma (mpfr_ptr y, mpfr_srcptr x, mpfr_save_expo_t *pexpo, -+                mpfr_ptr s1, mpfr_ptr s2, mpfr_rnd_t rnd) -+{ -+  mpfr_t t1, t2; -+  int inex1, inex2, sign; -+  MPFR_BLOCK_DECL (flags1); -+  MPFR_BLOCK_DECL (flags2); -+  MPFR_GROUP_DECL (group); -+ -+  MPFR_BLOCK (flags1, inex1 = mpfr_lgamma (s1, &sign, x, MPFR_RNDD)); -+  MPFR_ASSERTN (inex1 != 0); -+  /* s1 = RNDD(lngamma(x)), inexact */ -+  if (MPFR_UNLIKELY (MPFR_OVERFLOW (flags1))) -+    { -+      if (MPFR_SIGN (s1) > 0) -+        { -+          MPFR_SAVE_EXPO_UPDATE_FLAGS (*pexpo, MPFR_FLAGS_OVERFLOW); -+          return mpfr_overflow (y, rnd, sign); -+        } -+      else -+        { -+          MPFR_SAVE_EXPO_UPDATE_FLAGS (*pexpo, MPFR_FLAGS_UNDERFLOW); -+          return mpfr_underflow (y, rnd == MPFR_RNDN ? MPFR_RNDZ : rnd, sign); -+        } -+    } -+ -+  mpfr_set (s2, s1, MPFR_RNDN);     /* exact */ -+  mpfr_nextabove (s2);              /* v = RNDU(lngamma(z0)) */ -+ -+  if (sign < 0) -+    rnd = MPFR_INVERT_RND (rnd);  /* since the result with be negated */ -+  MPFR_GROUP_INIT_2 (group, MPFR_PREC (y), t1, t2); -+  MPFR_BLOCK (flags1, inex1 = mpfr_exp (t1, s1, rnd)); -+  MPFR_BLOCK (flags2, inex2 = mpfr_exp (t2, s2, rnd)); -+  /* t1 is the rounding with mode 'rnd' of a lower bound on |Gamma(x)|, -+     t2 is the rounding with mode 'rnd' of an upper bound, thus if both -+     are equal, so is the wanted result. If t1 and t2 differ or the flags -+     differ, at some point of Ziv's loop they should agree. */ -+  if (mpfr_equal_p (t1, t2) && flags1 == flags2) -+    { -+      MPFR_ASSERTN ((inex1 > 0 && inex2 > 0) || (inex1 < 0 && inex2 < 0)); -+      mpfr_set4 (y, t1, MPFR_RNDN, sign);  /* exact */ -+      if (sign < 0) -+        inex1 = - inex1; -+      MPFR_SAVE_EXPO_UPDATE_FLAGS (*pexpo, flags1); -+    } -+  else -+    inex1 = 0;  /* couldn't determine the result */ -+  MPFR_GROUP_CLEAR (group); -+ -+  return inex1; -+} -+ -+#else -+ -+static int -+unit_bit (mpfr_srcptr x) - { -   mpfr_exp_t expo; -   mpfr_prec_t prec; -@@ -75,6 +138,7 @@ -  -   return (x0 >> (prec % GMP_NUMB_BITS)) & 1; - } -+ - #endif -  - /* lngamma(x) = log(gamma(x)). -@@ -99,12 +163,14 @@ -   mpfr_t s, t, u, v, z; -   unsigned long m, k, maxm; -   mpz_t *INITIALIZED(B);  /* variable B declared as initialized */ --  int inexact, compared; -+  int compared; -+  int inexact = 0;  /* 0 means: result y not set yet */ -   mpfr_exp_t err_s, err_t; -   unsigned long Bm = 0; /* number of allocated B[] */ -   unsigned long oldBm; -   double d; -   MPFR_SAVE_EXPO_DECL (expo); -+  MPFR_ZIV_DECL (loop); -  -   compared = mpfr_cmp_ui (z0, 1); -  -@@ -122,7 +188,7 @@ -   if (MPFR_EXP(z0) <= - (mpfr_exp_t) MPFR_PREC(y)) -     { -       mpfr_t l, h, g; --      int ok, inex2; -+      int ok, inex1, inex2; -       mpfr_prec_t prec = MPFR_PREC(y) + 14; -       MPFR_ZIV_DECL (loop); -  -@@ -157,14 +223,14 @@ -           mpfr_sub (h, h, g, MPFR_RNDD); -           mpfr_mul (g, z0, z0, MPFR_RNDU); -           mpfr_add (h, h, g, MPFR_RNDU); --          inexact = mpfr_prec_round (l, MPFR_PREC(y), rnd); -+          inex1 = mpfr_prec_round (l, MPFR_PREC(y), rnd); -           inex2 = mpfr_prec_round (h, MPFR_PREC(y), rnd); -           /* Caution: we not only need l = h, but both inexact flags should -              agree. Indeed, one of the inexact flags might be zero. In that -              case if we assume lngamma(z0) cannot be exact, the other flag -              should be correct. We are conservative here and request that both -              inexact flags agree. */ --          ok = SAME_SIGN (inexact, inex2) && mpfr_cmp (l, h) == 0; -+          ok = SAME_SIGN (inex1, inex2) && mpfr_cmp (l, h) == 0; -           if (ok) -             mpfr_set (y, h, rnd); /* exact */ -           mpfr_clear (l); -@@ -172,8 +238,9 @@ -           mpfr_clear (g); -           if (ok) -             { -+              MPFR_ZIV_FREE (loop); -               MPFR_SAVE_EXPO_FREE (expo); --              return mpfr_check_range (y, inexact, rnd); -+              return mpfr_check_range (y, inex1, rnd); -             } -           /* since we have log|gamma(x)| = - log|x| - gamma*x + O(x^2), -              if x ~ 2^(-n), then we have a n-bit approximation, thus -@@ -205,9 +272,10 @@ -          thus lngamma(x) = log(Pi*(x-1)/sin(Pi*(2-x))) - lngamma(2-x) */ -  -       w = precy + MPFR_INT_CEIL_LOG2 (precy); -+      w += MPFR_INT_CEIL_LOG2 (w) + 14; -+      MPFR_ZIV_INIT (loop, w); -       while (1) -         { --          w += MPFR_INT_CEIL_LOG2 (w) + 14; -           MPFR_ASSERTD(w >= 3); -           mpfr_set_prec (s, w); -           mpfr_set_prec (t, w); -@@ -288,7 +356,9 @@ -                                   + (rnd == MPFR_RNDN))) -                 goto end; -             } -+          MPFR_ZIV_NEXT (loop, w); -         } -+      MPFR_ZIV_FREE (loop); -     } -  -   /* now z0 > 1 */ -@@ -298,10 +368,10 @@ -   /* since k is O(w), the value of log(z0*...*(z0+k-1)) is about w*log(w), -      so there is a cancellation of ~log(w) in the argument reconstruction */ -   w = precy + MPFR_INT_CEIL_LOG2 (precy); -- --  do -+  w += MPFR_INT_CEIL_LOG2 (w) + 13; -+  MPFR_ZIV_INIT (loop, w); -+  while (1) -     { --      w += MPFR_INT_CEIL_LOG2 (w) + 13; -       MPFR_ASSERTD (w >= 3); -  -       /* argument reduction: we compute gamma(z0 + k), where the series -@@ -441,6 +511,15 @@ - #ifdef IS_GAMMA -       err_s = MPFR_GET_EXP(s); -       mpfr_exp (s, s, MPFR_RNDN); -+      /* If s is +Inf, we compute exp(lngamma(z0)). */ -+      if (mpfr_inf_p (s)) -+        { -+          inexact = mpfr_explgamma (y, z0, &expo, s, t, rnd); -+          if (inexact) -+            goto end0; -+          else -+            goto ziv_next; -+        } -       /* before the exponential, we have s = s0 + h where -          |h| <= (2m+48)*ulp(s), thus exp(s0) = exp(s) * exp(-h). -          For |h| <= 1/4, we have |exp(h)-1| <= 1.2*|h| thus -@@ -480,16 +559,26 @@ -       err_s = (err_t == err_s) ? 1 + err_s : ((err_t > err_s) ? err_t : err_s); -       err_s += 1 - MPFR_GET_EXP(s); - #endif -+      if (MPFR_LIKELY (MPFR_CAN_ROUND (s, w - err_s, precy, rnd))) -+        break; -+#ifdef IS_GAMMA -+    ziv_next: -+#endif -+      MPFR_ZIV_NEXT (loop, w); -     } --  while (MPFR_UNLIKELY (!MPFR_CAN_ROUND (s, w - err_s, precy, rnd))); -  -+#ifdef IS_GAMMA -+ end0: -+#endif -   oldBm = Bm; -   while (Bm--) -     mpz_clear (B[Bm]); -   (*__gmp_free_func) (B, oldBm * sizeof (mpz_t)); -  -  end: --  inexact = mpfr_set (y, s, rnd); -+  if (inexact == 0) -+    inexact = mpfr_set (y, s, rnd); -+  MPFR_ZIV_FREE (loop); -  -   mpfr_clear (s); -   mpfr_clear (t); -diff -Naurd mpfr-3.1.0-a/src/mpfr.h mpfr-3.1.0-b/src/mpfr.h ---- mpfr-3.1.0-a/src/mpfr.h	2012-04-27 01:13:15.000000000 +0000 -+++ mpfr-3.1.0-b/src/mpfr.h	2012-05-07 18:52:45.000000000 +0000 -@@ -27,7 +27,7 @@ - #define MPFR_VERSION_MAJOR 3 - #define MPFR_VERSION_MINOR 1 - #define MPFR_VERSION_PATCHLEVEL 0 --#define MPFR_VERSION_STRING "3.1.0-p9" -+#define MPFR_VERSION_STRING "3.1.0-p10" -  - /* Macros dealing with MPFR VERSION */ - #define MPFR_VERSION_NUM(a,b,c) (((a) << 16L) | ((b) << 8) | (c)) -diff -Naurd mpfr-3.1.0-a/src/version.c mpfr-3.1.0-b/src/version.c ---- mpfr-3.1.0-a/src/version.c	2012-04-27 01:13:15.000000000 +0000 -+++ mpfr-3.1.0-b/src/version.c	2012-05-07 18:52:45.000000000 +0000 -@@ -25,5 +25,5 @@ - const char * - mpfr_get_version (void) - { --  return "3.1.0-p9"; -+  return "3.1.0-p10"; - } -diff -Naurd mpfr-3.1.0-a/tests/tgamma.c mpfr-3.1.0-b/tests/tgamma.c ---- mpfr-3.1.0-a/tests/tgamma.c	2012-04-27 01:13:15.000000000 +0000 -+++ mpfr-3.1.0-b/tests/tgamma.c	2012-05-07 18:52:45.000000000 +0000 -@@ -838,6 +838,175 @@ -     exit (1); - } -  -+/* Test mpfr_gamma in precision p1 by comparing it with exp(lgamma(x)) -+   computing with a working precision p2. Assume that x is not an -+   integer <= 2. */ -+static void -+exp_lgamma (mpfr_t x, mpfr_prec_t p1, mpfr_prec_t p2) -+{ -+  mpfr_t yd, yu, zd, zu; -+  int inexd, inexu, sign; -+  int underflow = -1, overflow = -1;  /* -1: we don't know */ -+  int got_underflow, got_overflow; -+ -+  if (mpfr_integer_p (x) && mpfr_cmp_si (x, 2) <= 0) -+    { -+      printf ("Warning! x is an integer <= 2 in exp_lgamma: "); -+      mpfr_out_str (stdout, 10, 0, x, MPFR_RNDN); putchar ('\n'); -+      return; -+    } -+  mpfr_inits2 (p2, yd, yu, (mpfr_ptr) 0); -+  inexd = mpfr_lgamma (yd, &sign, x, MPFR_RNDD); -+  mpfr_set (yu, yd, MPFR_RNDN);  /* exact */ -+  if (inexd) -+    mpfr_nextabove (yu); -+  mpfr_clear_flags (); -+  mpfr_exp (yd, yd, MPFR_RNDD); -+  if (! mpfr_underflow_p ()) -+    underflow = 0; -+  if (mpfr_overflow_p ()) -+    overflow = 1; -+  mpfr_clear_flags (); -+  mpfr_exp (yu, yu, MPFR_RNDU); -+  if (mpfr_underflow_p ()) -+    underflow = 1; -+  if (! mpfr_overflow_p ()) -+    overflow = 0; -+  if (sign < 0) -+    { -+      mpfr_neg (yd, yd, MPFR_RNDN);  /* exact */ -+      mpfr_neg (yu, yu, MPFR_RNDN);  /* exact */ -+      mpfr_swap (yd, yu); -+    } -+  /* yd < Gamma(x) < yu (strict inequalities since x != 1 and x != 2) */ -+  mpfr_inits2 (p1, zd, zu, (mpfr_ptr) 0); -+  mpfr_clear_flags (); -+  inexd = mpfr_gamma (zd, x, MPFR_RNDD);  /* zd <= Gamma(x) < yu */ -+  got_underflow = underflow == -1 ? -1 : !! mpfr_underflow_p (); -+  got_overflow = overflow == -1 ? -1 : !! mpfr_overflow_p (); -+  if (! mpfr_less_p (zd, yu) || inexd > 0 || -+      got_underflow != underflow || -+      got_overflow != overflow) -+    { -+      printf ("Error in exp_lgamma on x = "); -+      mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n'); -+      printf ("yu = "); -+      mpfr_dump (yu); -+      printf ("zd = "); -+      mpfr_dump (zd); -+      printf ("got inexd = %d, expected <= 0\n", inexd); -+      printf ("got underflow = %d, expected %d\n", got_underflow, underflow); -+      printf ("got overflow = %d, expected %d\n", got_overflow, overflow); -+      exit (1); -+    } -+  mpfr_clear_flags (); -+  inexu = mpfr_gamma (zu, x, MPFR_RNDU);  /* zu >= Gamma(x) > yd */ -+  got_underflow = underflow == -1 ? -1 : !! mpfr_underflow_p (); -+  got_overflow = overflow == -1 ? -1 : !! mpfr_overflow_p (); -+  if (! mpfr_greater_p (zu, yd) || inexu < 0 || -+      got_underflow != underflow || -+      got_overflow != overflow) -+    { -+      printf ("Error in exp_lgamma on x = "); -+      mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n'); -+      printf ("yd = "); -+      mpfr_dump (yd); -+      printf ("zu = "); -+      mpfr_dump (zu); -+      printf ("got inexu = %d, expected >= 0\n", inexu); -+      printf ("got underflow = %d, expected %d\n", got_underflow, underflow); -+      printf ("got overflow = %d, expected %d\n", got_overflow, overflow); -+      exit (1); -+    } -+  if (mpfr_equal_p (zd, zu)) -+    { -+      if (inexd != 0 || inexu != 0) -+        { -+          printf ("Error in exp_lgamma on x = "); -+          mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n'); -+          printf ("zd = zu, thus exact, but inexd = %d and inexu = %d\n", -+                  inexd, inexu); -+          exit (1); -+        } -+      MPFR_ASSERTN (got_underflow == 0); -+      MPFR_ASSERTN (got_overflow == 0); -+    } -+  else if (inexd == 0 || inexu == 0) -+    { -+      printf ("Error in exp_lgamma on x = "); -+          mpfr_out_str (stdout, 16, 0, x, MPFR_RNDN); putchar ('\n'); -+          printf ("zd != zu, thus inexact, but inexd = %d and inexu = %d\n", -+                  inexd, inexu); -+          exit (1); -+    } -+  mpfr_clears (yd, yu, zd, zu, (mpfr_ptr) 0); -+} -+ -+static void -+exp_lgamma_tests (void) -+{ -+  mpfr_t x; -+  mpfr_exp_t emin, emax; -+  int i; -+ -+  emin = mpfr_get_emin (); -+  emax = mpfr_get_emax (); -+  set_emin (MPFR_EMIN_MIN); -+  set_emax (MPFR_EMAX_MAX); -+ -+  mpfr_init2 (x, 96); -+  for (i = 3; i <= 8; i++) -+    { -+      mpfr_set_ui (x, i, MPFR_RNDN); -+      exp_lgamma (x, 53, 64); -+      mpfr_nextbelow (x); -+      exp_lgamma (x, 53, 64); -+      mpfr_nextabove (x); -+      mpfr_nextabove (x); -+      exp_lgamma (x, 53, 64); -+    } -+  mpfr_set_str (x, "1.7", 10, MPFR_RNDN); -+  exp_lgamma (x, 53, 64); -+  mpfr_set_str (x, "-4.6308260837372266e+07", 10, MPFR_RNDN); -+  exp_lgamma (x, 53, 64); -+  mpfr_set_str (x, "-90.6308260837372266e+15", 10, MPFR_RNDN); -+  exp_lgamma (x, 53, 64); -+  /* The following test gives a large positive result < +Inf */ -+  mpfr_set_str (x, "1.2b13fc45a92dea1@14", 16, MPFR_RNDN); -+  exp_lgamma (x, 53, 64); -+  /* Idem for a large negative result > -Inf */ -+  mpfr_set_str (x, "-1.2b13fc45a92de81@14", 16, MPFR_RNDN); -+  exp_lgamma (x, 53, 64); -+  /* The following two tests trigger an endless loop in r8186 -+     on 64-bit machines (64-bit exponent). The second one (due -+     to undetected overflow) is a direct consequence of the -+     first one, due to the call of Gamma(2-x) if x < 1. */ -+  mpfr_set_str (x, "1.2b13fc45a92dec8@14", 16, MPFR_RNDN); -+  exp_lgamma (x, 53, 64); -+  mpfr_set_str (x, "-1.2b13fc45a92dea8@14", 16, MPFR_RNDN); -+  exp_lgamma (x, 53, 64); -+  /* Similar tests (overflow threshold) for 32-bit machines. */ -+  mpfr_set_str (x, "2ab68d8.657542f855111c61", 16, MPFR_RNDN); -+  exp_lgamma (x, 12, 64); -+  mpfr_set_str (x, "-2ab68d6.657542f855111c61", 16, MPFR_RNDN); -+  exp_lgamma (x, 12, 64); -+  /* The following test is an overflow on 32-bit and 64-bit machines. -+     Revision r8189 fails on 64-bit machines as the flag is unset. */ -+  mpfr_set_str (x, "1.2b13fc45a92ded8@14", 16, MPFR_RNDN); -+  exp_lgamma (x, 53, 64); -+  /* On the following tests, with r8196, one gets an underflow on -+     32-bit machines, while a normal result is expected (see FIXME -+     in gamma.c:382). */ -+  mpfr_set_str (x, "-2ab68d6.657542f855111c6104", 16, MPFR_RNDN); -+  exp_lgamma (x, 12, 64);  /* failure on 32-bit machines */ -+  mpfr_set_str (x, "-12b13fc45a92deb.1c6c5bc964", 16, MPFR_RNDN); -+  exp_lgamma (x, 12, 64);  /* failure on 64-bit machines */ -+  mpfr_clear (x); -+ -+  set_emin (emin); -+  set_emax (emax); -+} -+ - int - main (int argc, char *argv[]) - { -@@ -852,6 +1021,7 @@ -   test20071231 (); -   test20100709 (); -   test20120426 (); -+  exp_lgamma_tests (); -  -   data_check ("data/gamma", mpfr_gamma, "mpfr_gamma"); -  diff --git a/abs/core/mpfr/mpfr-3.1.6-p1.patch b/abs/core/mpfr/mpfr-3.1.6-p1.patch new file mode 100644 index 0000000..5c742f0 --- /dev/null +++ b/abs/core/mpfr/mpfr-3.1.6-p1.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/abs/core/mpfr/mpfr.install b/abs/core/mpfr/mpfr.install deleted file mode 100644 index d6dd047..0000000 --- a/abs/core/mpfr/mpfr.install +++ /dev/null @@ -1,20 +0,0 @@ -info_dir=usr/share/info -info_files=(mpfr.info) - -post_install() { -  [ -x usr/bin/install-info ] || return 0 -  for f in ${info_files[@]}; do -    install-info ${info_dir}/$f.gz ${info_dir}/dir 2> /dev/null -  done -} - -post_upgrade() { -  post_install $1 -} - -pre_remove() { -  [ -x usr/bin/install-info ] || return 0 -  for f in ${info_files[@]}; do -    install-info --delete ${info_dir}/$f.gz ${info_dir}/dir 2> /dev/null -  done -} | 
