[COMMITTED] math: Sync lgammaf with CORE-MATH
Adhemerval Zanella Netto
adhemerval.zanella@linaro.org
Fri Mar 20 17:09:52 GMT 2026
On 20/03/26 07:42, Paul Zimmermann wrote:
> Hi Adhemerval,
>
> with the CORE-MATH test suite, I get:
>
> zimmerma@thym:~/svn/core-math$ CORE_MATH_CHECK_STD=true CORE_MATH_LAUNCHER="/tmp/lib/ld-linux-x86-64.so.2 --library-path /tmp/lib:/usr/lib/x86_64-linux-gnu" LDFLAGS="-L /tmp/lib" ./check.sh lgammaf
> Running exhaustive check in --rndn mode...
> all ok
> Running exhaustive check in --rndz mode...
> Spurious overflow exception for x=0x1.895f1cp+121 (y=0x1.fffffep+127)
>
> Please can you check?
It seems to be a pre-existing issue, on 5c28a3cf9f (pre-sync) if I add
0x1.895f1cp+121 on math/auto-libm-test-in and regenerating
math/auto-libm-test-out-lgamma (as below) I see:
$ math/test-float-lgamma
testing float (without inline functions)
Failure: lgamma (0x3.12be38p+120): errno set to 0, expected 34 (ERANGE)
Failure: lgamma_upward (0x3.12be38p+120): errno set to 0, expected 34 (ERANGE)
Test suite completed:
Maximum error found of `0' ulp
8 max error test cases,
7368 input tests,
- with 29488 tests for exception flags,
- with 3688 tests for errno executed.
2 errors occurred.
I forgot to sync the some ERANGE fixes like 20d51f2ee1e945cdc910aa3fbd40c7d5959ff3d0.
I will add the following patch:
diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in
index 4c3cd23ffd..2574957ada 100644
--- a/math/auto-libm-test-in
+++ b/math/auto-libm-test-in
@@ -6994,6 +6994,7 @@ lgamma -0x3.ec4298p+0
lgamma 0x1.ecf3fep-73
lgamma 0x1.58ace8p+112
lgamma -0x1.efc2a2p+14
+lgamma 0x1.895f1cp+121
# Values +/- 10ulp from overflow threshold. (Values very close to
# overflow threshold produce results very close of that threshold,
diff --git a/math/auto-libm-test-out-lgamma b/math/auto-libm-test-out-lgamma
index d27c186639..fed3f86c6c 100644
--- a/math/auto-libm-test-out-lgamma
+++ b/math/auto-libm-test-out-lgamma
@@ -2301,6 +2301,31 @@ lgamma -0x1.efc2a2p+14
= lgamma tonearest ibm128 -0x7.bf0a88p+12 : -0x4.88b6f00000005971e29c3b8dd8p+16 -1 : inexact-ok
= lgamma towardzero ibm128 -0x7.bf0a88p+12 : -0x4.88b6f00000005971e29c3b8dd8p+16 -1 : inexact-ok
= lgamma upward ibm128 -0x7.bf0a88p+12 : -0x4.88b6f00000005971e29c3b8dd8p+16 -1 : inexact-ok
+lgamma 0x1.895f1cp+121
+= lgamma downward binary32 0x3.12be38p+120 : 0xf.fffffp+124 1 : inexact-ok
+= lgamma tonearest binary32 0x3.12be38p+120 : plus_infty 1 : inexact-ok overflow errno-erange
+= lgamma towardzero binary32 0x3.12be38p+120 : 0xf.fffffp+124 1 : inexact-ok
+= lgamma upward binary32 0x3.12be38p+120 : plus_infty 1 : inexact-ok overflow errno-erange
+= lgamma downward binary64 0x3.12be38p+120 : 0xf.fffffbf5af3fp+124 1 : inexact-ok
+= lgamma tonearest binary64 0x3.12be38p+120 : 0xf.fffffbf5af3f8p+124 1 : inexact-ok
+= lgamma towardzero binary64 0x3.12be38p+120 : 0xf.fffffbf5af3fp+124 1 : inexact-ok
+= lgamma upward binary64 0x3.12be38p+120 : 0xf.fffffbf5af3f8p+124 1 : inexact-ok
+= lgamma downward intel96 0x3.12be38p+120 : 0xf.fffffbf5af3f533p+124 1 : inexact-ok
+= lgamma tonearest intel96 0x3.12be38p+120 : 0xf.fffffbf5af3f534p+124 1 : inexact-ok
+= lgamma towardzero intel96 0x3.12be38p+120 : 0xf.fffffbf5af3f533p+124 1 : inexact-ok
+= lgamma upward intel96 0x3.12be38p+120 : 0xf.fffffbf5af3f534p+124 1 : inexact-ok
+= lgamma downward m68k96 0x3.12be38p+120 : 0xf.fffffbf5af3f533p+124 1 : inexact-ok
+= lgamma tonearest m68k96 0x3.12be38p+120 : 0xf.fffffbf5af3f534p+124 1 : inexact-ok
+= lgamma towardzero m68k96 0x3.12be38p+120 : 0xf.fffffbf5af3f533p+124 1 : inexact-ok
+= lgamma upward m68k96 0x3.12be38p+120 : 0xf.fffffbf5af3f534p+124 1 : inexact-ok
+= lgamma downward binary128 0x3.12be38p+120 : 0xf.fffffbf5af3f533cd835e6dc7ed8p+124 1 : inexact-ok
+= lgamma tonearest binary128 0x3.12be38p+120 : 0xf.fffffbf5af3f533cd835e6dc7ed8p+124 1 : inexact-ok
+= lgamma towardzero binary128 0x3.12be38p+120 : 0xf.fffffbf5af3f533cd835e6dc7ed8p+124 1 : inexact-ok
+= lgamma upward binary128 0x3.12be38p+120 : 0xf.fffffbf5af3f533cd835e6dc7eep+124 1 : inexact-ok
+= lgamma downward ibm128 0x3.12be38p+120 : 0xf.fffffbf5af3f533cd835e6dc7cp+124 1 : inexact-ok
+= lgamma tonearest ibm128 0x3.12be38p+120 : 0xf.fffffbf5af3f533cd835e6dc8p+124 1 : inexact-ok
+= lgamma towardzero ibm128 0x3.12be38p+120 : 0xf.fffffbf5af3f533cd835e6dc7cp+124 1 : inexact-ok
+= lgamma upward ibm128 0x3.12be38p+120 : 0xf.fffffbf5af3f533cd835e6dc8p+124 1 : inexact-ok
lgamma 0x3.12be0cp+120
= lgamma downward binary32 0x3.12be0cp+120 : 0xf.ffff1p+124 1 : inexact-ok
= lgamma tonearest binary32 0x3.12be0cp+120 : 0xf.ffff1p+124 1 : inexact-ok
diff --git a/sysdeps/ieee754/flt-32/e_lgammaf_r.c b/sysdeps/ieee754/flt-32/e_lgammaf_r.c
index 7b947cd979..8efec19b48 100644
--- a/sysdeps/ieee754/flt-32/e_lgammaf_r.c
+++ b/sysdeps/ieee754/flt-32/e_lgammaf_r.c
@@ -208,7 +208,19 @@ __lgammaf_r (float x, int *signgamp)
if (ax > 0x1.afc1ap+1f)
{
if (__glibc_unlikely (x >= 0x1.895f1cp+121f))
- return __math_oflowf (0);
+ {
+ /* for x=0x1.895f1cp+121, lgamma(x) < 2^128, thus there is no
+ overflow for rounding towards zero or downwards.
+ The following expression overflows for x > 0x1.895f1cp+121
+ or x = 0x1.895f1cp+121 and rounding to nearest or away,
+ and does not overflow for x = 0x1.895f1cp+121 and rounding
+ towards zero */
+ float r = fmaf (x, 0x1.4d3398p+6f, 0x1.10f35ep+103f);
+ if (x > 0x1.895f1cp+121f || (x == 0x1.895f1cp+121f &&
+ x * 5.0f >= 0x1.ebb6e4p+123))
+ return __math_oflowf (0);
+ return r;
+ }
double lz = as_ln (z);
f = (z - 0.5) * (lz - 1) + 0x1.acfe390c97d69p-2;
if (ax < 0x1.0p+20f)
More information about the Libc-alpha
mailing list