[PATCH 5/8] math: Fix potential underflow on ldbl-128 erfl

H.J. Lu hjl.tools@gmail.com
Thu Dec 18 00:00:05 GMT 2025


On Thu, Dec 18, 2025 at 1:56 AM Adhemerval Zanella
<adhemerval.zanella@linaro.org> wrote:
>
> The multiplication operation is required only if the branch is taken,
> and the compiler might not optimize it away.
>
> It fixes the following issues when the testcase is built with clang:
>
> FAIL: math/test-ldouble-erf
> Failure: erf (-0x4p-16384): Exception "Underflow" set
> Failure: erf (0x1p-10000): Exception "Underflow" set
> Failure: erf (0x3.8b7f12369ded54f38760a41abb84p-16384): Exception "Underflow" set
> Failure: erf (0x3.8b7f12369ded54f38760a41abb88p-16384): Exception "Underflow" set
> Failure: erf (0x3.8b7f12369ded54f4p-16384): Exception "Underflow" set
> Failure: erf (0x3.8b7f12369ded54f8p-16384): Exception "Underflow" set
> Failure: erf (0x3.8b7f12369ded5518p-16384): Exception "Underflow" set
> Failure: erf (0x3.8b7f12369ded551cp-16384): Exception "Underflow" set
> Failure: erf (0x3.8b7f12369ded552p-16384): Exception "Underflow" set
> Failure: erf (0x4p-16384): Exception "Underflow" set
> Failure: erf_downward (-0x4p-16384): Exception "Underflow" set
> Failure: erf_downward (0x1p-10000): Exception "Underflow" set
> Failure: erf_downward (0x3.8b7f12369ded54f38760a41abb84p-16384): Exception "Underflow" set
> Failure: erf_downward (0x3.8b7f12369ded54f38760a41abb88p-16384): Exception "Underflow" set
> Failure: erf_downward (0x3.8b7f12369ded54f4p-16384): Exception "Underflow" set
> Failure: erf_downward (0x3.8b7f12369ded54f8p-16384): Exception "Underflow" set
> Failure: erf_downward (0x3.8b7f12369ded5518p-16384): Exception "Underflow" set
> Failure: erf_downward (0x3.8b7f12369ded551cp-16384): Exception "Underflow" set
> Failure: erf_downward (0x3.8b7f12369ded552p-16384): Exception "Underflow" set
> Failure: erf_downward (0x4p-16384): Exception "Underflow" set
> Failure: erf_towardzero (-0x4p-16384): Exception "Underflow" set
> Failure: erf_towardzero (0x1p-10000): Exception "Underflow" set
> Failure: erf_towardzero (0x3.8b7f12369ded54f38760a41abb84p-16384): Exception "Underflow" set
> Failure: erf_towardzero (0x3.8b7f12369ded54f38760a41abb88p-16384): Exception "Underflow" set
> Failure: erf_towardzero (0x3.8b7f12369ded54f4p-16384): Exception "Underflow" set
> Failure: erf_towardzero (0x3.8b7f12369ded54f8p-16384): Exception "Underflow" set
> Failure: erf_towardzero (0x3.8b7f12369ded5518p-16384): Exception "Underflow" set
> Failure: erf_towardzero (0x3.8b7f12369ded551cp-16384): Exception "Underflow" set
> Failure: erf_towardzero (0x3.8b7f12369ded552p-16384): Exception "Underflow" set
> Failure: erf_towardzero (0x4p-16384): Exception "Underflow" set
> Failure: erf_upward (-0x4p-16384): Exception "Underflow" set
> Failure: erf_upward (0x1p-10000): Exception "Underflow" set
> Failure: erf_upward (0x3.8b7f12369ded54f38760a41abb84p-16384): Exception "Underflow" set
> Failure: erf_upward (0x3.8b7f12369ded54f38760a41abb88p-16384): Exception "Underflow" set
> Failure: erf_upward (0x3.8b7f12369ded54f4p-16384): Exception "Underflow" set
> Failure: erf_upward (0x3.8b7f12369ded54f8p-16384): Exception "Underflow" set
> Failure: erf_upward (0x3.8b7f12369ded5518p-16384): Exception "Underflow" set
> Failure: erf_upward (0x3.8b7f12369ded551cp-16384): Exception "Underflow" set
> Failure: erf_upward (0x3.8b7f12369ded552p-16384): Exception "Underflow" set
> Failure: erf_upward (0x4p-16384): Exception "Underflow" set
>
> Checked on x86_64-linux-gnu and aarch64-linux-gnu with gcc-15 and
> clang-18.
> ---
>  sysdeps/ieee754/ldbl-128/s_erfl.c | 2 +-
>  1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/sysdeps/ieee754/ldbl-128/s_erfl.c b/sysdeps/ieee754/ldbl-128/s_erfl.c
> index 1cbedc249d..e52d88bde3 100644
> --- a/sysdeps/ieee754/ldbl-128/s_erfl.c
> +++ b/sysdeps/ieee754/ldbl-128/s_erfl.c
> @@ -778,7 +778,6 @@ __erfl (_Float128 x)
>      }
>    u.parts32.w0 = ix;
>    a = u.value;
> -  z = x * x;
>    if (ix < 0x3ffec000)  /* a < 0.875 */
>      {
>        if (ix < 0x3fc60000) /* |x|<2**-57 */
> @@ -792,6 +791,7 @@ __erfl (_Float128 x)
>             }
>           return x + efx * x;
>         }
> +      z = x * x;
>        y = a + a * neval (z, TN1, NTN1) / deval (z, TD1, NTD1);
>      }
>    else
> --
> 2.43.0
>

LGTM.

Reviewed-by: H.J. Lu <hjl.tools@gmail.com>

Thanks.

-- 
H.J.


More information about the Libc-alpha mailing list