[libc-commits] [libc] [libc][math] Fix `tanpif` and `tanpif16` error handling (PR #235296)

Connector Switch via libc-commits libc-commits at lists.llvm.org
Sat Oct 24 23:10:16 PDT 2026


================
@@ -62,13 +62,22 @@ LIBC_INLINE float tanpif(float x) {
   if (LIBC_UNLIKELY(x_abs == 0U))
     return x;
 
+  // tanpi(x) underflows for 0 < |x| <= 0x1.45f3p-128.
+  if (LIBC_UNLIKELY(x_abs <= 0x0028'be60U))
+    fputil::set_errno_if_required(ERANGE);
+
   if (LIBC_UNLIKELY(fputil::is_integer(x))) {
     // Preserve the input sign for even integers and flip it for odd integers.
     Sign sign =
         fputil::is_odd_integer(x) ? xbits.sign().negate() : xbits.sign();
     return FPBits::zero(sign).get_val();
   }
 
+  // Odd multiples of 1/4 have exact results of +1 or -1.
+  double xd = static_cast<double>(x);
+  if (LIBC_UNLIKELY(fputil::is_odd_integer(4.0 * xd)))
+    return fputil::is_odd_integer(2.0 * xd - 0.5) ? -1.0f : 1.0f;
----------------
c8ef wrote:

Fixed.

https://github.com/llvm/llvm-project/pull/235296


More information about the libc-commits mailing list