diff -Naurd mpfr-4.1.0-a/PATCHES mpfr-4.1.0-b/PATCHES
--- mpfr-4.1.0-a/PATCHES	2021-02-17 17:22:34.594973310 +0000
+++ mpfr-4.1.0-b/PATCHES	2021-02-17 17:22:34.702972090 +0000
@@ -0,0 +1 @@
+digamma-interm-zero2
diff -Naurd mpfr-4.1.0-a/VERSION mpfr-4.1.0-b/VERSION
--- mpfr-4.1.0-a/VERSION	2021-02-11 12:53:38.426850512 +0000
+++ mpfr-4.1.0-b/VERSION	2021-02-17 17:22:34.702972090 +0000
@@ -1 +1 @@
-4.1.0-p7
+4.1.0-p8
diff -Naurd mpfr-4.1.0-a/src/digamma.c mpfr-4.1.0-b/src/digamma.c
--- mpfr-4.1.0-a/src/digamma.c	2021-02-11 12:52:52.547350357 +0000
+++ mpfr-4.1.0-b/src/digamma.c	2021-02-17 17:22:34.690972226 +0000
@@ -173,16 +173,19 @@
       mpfr_digamma (v, u, MPFR_RNDN);   /* error <= 1/2 ulp */
       expv = MPFR_GET_EXP (v);
       mpfr_sub (v, v, t, MPFR_RNDN);
-      if (MPFR_GET_EXP (v) < MPFR_GET_EXP (t))
-        e1 += MPFR_EXP(t) - MPFR_EXP(v); /* scale error for t wrt new v */
-      /* now take into account the 1/2 ulp error for v */
-      if (expv - MPFR_EXP(v) - 1 > e1)
-        e1 = expv - MPFR_EXP(v) - 1;
-      else
-        e1 ++;
-      e1 ++; /* rounding error for mpfr_sub */
-      if (MPFR_CAN_ROUND (v, p - e1, MPFR_PREC(y), rnd_mode))
-        break;
+      if (MPFR_NOTZERO(v))
+        {
+          if (MPFR_GET_EXP (v) < MPFR_GET_EXP (t))
+            e1 += MPFR_EXP(t) - MPFR_EXP(v); /* scale error for t wrt new v */
+          /* now take into account the 1/2 ulp error for v */
+          if (expv - MPFR_EXP(v) - 1 > e1)
+            e1 = expv - MPFR_EXP(v) - 1;
+          else
+            e1 ++;
+          e1 ++; /* rounding error for mpfr_sub */
+          if (MPFR_CAN_ROUND (v, p - e1, MPFR_PREC(y), rnd_mode))
+            break;
+        }
       MPFR_ZIV_NEXT (loop, p);
       mpfr_set_prec (t, p);
       mpfr_set_prec (v, p);
@@ -416,10 +419,8 @@
         }
     }
 
-  if (MPFR_IS_NEG(x))
-    inex = mpfr_digamma_reflection (y, x, rnd_mode);
   /* if x < 1/2 we use the reflection formula */
-  else if (MPFR_EXP(x) < 0)
+  if (MPFR_IS_NEG(x) || MPFR_EXP(x) < 0)
     inex = mpfr_digamma_reflection (y, x, rnd_mode);
   else
     inex = mpfr_digamma_positive (y, x, rnd_mode);
diff -Naurd mpfr-4.1.0-a/src/mpfr.h mpfr-4.1.0-b/src/mpfr.h
--- mpfr-4.1.0-a/src/mpfr.h	2021-02-11 12:53:38.422850555 +0000
+++ mpfr-4.1.0-b/src/mpfr.h	2021-02-17 17:22:34.702972090 +0000
@@ -27,7 +27,7 @@
 #define MPFR_VERSION_MAJOR 4
 #define MPFR_VERSION_MINOR 1
 #define MPFR_VERSION_PATCHLEVEL 0
-#define MPFR_VERSION_STRING "4.1.0-p7"
+#define MPFR_VERSION_STRING "4.1.0-p8"
 
 /* User macros:
    MPFR_USE_FILE:        Define it to make MPFR define functions dealing
diff -Naurd mpfr-4.1.0-a/src/version.c mpfr-4.1.0-b/src/version.c
--- mpfr-4.1.0-a/src/version.c	2021-02-11 12:53:38.426850512 +0000
+++ mpfr-4.1.0-b/src/version.c	2021-02-17 17:22:34.702972090 +0000
@@ -25,5 +25,5 @@
 const char *
 mpfr_get_version (void)
 {
-  return "4.1.0-p7";
+  return "4.1.0-p8";
 }
diff -Naurd mpfr-4.1.0-a/tests/tdigamma.c mpfr-4.1.0-b/tests/tdigamma.c
--- mpfr-4.1.0-a/tests/tdigamma.c	2021-02-11 12:52:52.547350357 +0000
+++ mpfr-4.1.0-b/tests/tdigamma.c	2021-02-17 17:22:34.690972226 +0000
@@ -110,6 +110,26 @@
   mpfr_clear (y);
 }
 
+/* another test that fails with GMP_CHECK_RANDOMIZE=1613197421465830
+   on revision 14429 */
+static void
+bug20210215 (void)
+{
+  mpfr_t x, y;
+  int inex;
+
+  mpfr_init2 (x, 510);
+  mpfr_init2 (y, 4);
+  mpfr_set_str (x, "-8.2923051438433494998166335341807999322052669984208422481227138906096000469898717007386115912802685588348601663465077353194268894939972221117314512518182580e+35", 10, MPFR_RNDN);
+  mpfr_clear_flags ();
+  inex = mpfr_digamma (y, x, MPFR_RNDU);
+  MPFR_ASSERTN (mpfr_cmp_ui0 (y, 88) == 0);
+  MPFR_ASSERTN (inex > 0);
+  MPFR_ASSERTN (__gmpfr_flags == MPFR_FLAGS_INEXACT);
+  mpfr_clear (x);
+  mpfr_clear (y);
+}
+
 int
 main (int argc, char *argv[])
 {
@@ -118,6 +138,7 @@
   special ();
   bug20210206 ();
   bug20210208 ();
+  bug20210215 ();
 
   test_generic (MPFR_PREC_MIN, 200, 20);
 
