]> git.ipfire.org Git - thirdparty/glibc.git/commitdiff
math: Fix pow special case [BZ #33563]
authorWilco Dijkstra <wilco.dijkstra@arm.com>
Thu, 30 Oct 2025 15:24:53 +0000 (15:24 +0000)
committerWilco Dijkstra <wilco.dijkstra@arm.com>
Fri, 31 Oct 2025 19:13:41 +0000 (19:13 +0000)
Fix pow (DBL_MAX, 1.0) to return DBL_MAX when rouding upwards without FMA.
This fixes BZ #33563.

Reviewed-by: Adhemerval Zanella <adhemerval.zanella@linaro.org>
sysdeps/ieee754/dbl-64/e_pow.c

index 3d6933137c3558fd2f55972d76c8dd09003764f3..3dc171885a31bc65438040faccbcf9f996bdc4bf 100644 (file)
@@ -147,8 +147,14 @@ specialcase (double_t tmp, uint64_t sbits, uint64_t ki)
       /* k > 0, the exponent of scale might have overflowed by <= 460.  */
       sbits -= 1009ull << 52;
       scale = asdouble (sbits);
-      y = 0x1p1009 * (scale + scale * tmp);
-      return check_oflow (y);
+      y = scale + scale * tmp;
+#ifndef __FP_FAST_FMA
+      /* Special case pow (0x1.fffffffffffffp+1023, 1.0) when rounding up.  */
+      if (WANT_ROUNDING && y == 0x1p15
+         && (math_opt_barrier (1.0) + 0x1p-60) != 1.0)
+       return DBL_MAX;
+#endif
+      return check_oflow (y * 0x1p1009);
     }
   /* k < 0, need special care in the subnormal range.  */
   sbits += 1022ull << 52;