[PATCH 15/25] math: Use asinh from CORE-MATH

DJ Delorie dj@redhat.com
Wed Sep 10 03:15:09 GMT 2025


Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> +/* Correctly-rounded inverse hyperbolic sine function for the
> +   binary64 floating point format.

Can this be squeezed into one line?  I see other files with multi-line
"first lines" but I don't know if the one-line-description is a rule or
a guideline...

> +static inline double
> +fasttwosum (double x, double y, double *e)
> +{
> +  double s = x + y, z = s - x;
> +  *e = y - z;
> +  return s;
> +}
> +
> +static inline double
> +adddd (double xh, double xl, double ch, double cl, double *l)
> +{
> +  double s = xh + ch, d = s - xh;
> +  *l = ((ch - d) + (xh + (d - s))) + (xl + cl);
> +  return s;
> +}
> +
> +static inline double
> +muldd (double xh, double xl, double ch, double cl, double *l)
> +{
> +  double ahlh = ch * xl, alhh = cl * xh, ahhh = ch * xh,
> +	 ahhl = fma (ch, xh, -ahhh);
> +  ahhl += alhh + ahlh;
> +  ch = ahhh + ahhl;
> +  *l = (ahhh - ch) + ahhl;
> +  return ch;
> +}
> +
> +static inline double
> +mulddd (double xh, double xl, double ch, double *l)
> +{
> +  double ahlh = ch * xl, ahhh = ch * xh, ahhl = fma (ch, xh, -ahhh);
> +  ahhl += ahlh;
> +  ch = ahhh + ahhl;
> +  *l = (ahhh - ch) + ahhl;
> +  return ch;
> +}
> +
> +static inline double
> +polydd (double xh, double xl, int n, const double c[][2], double *l)
> +{
> +  int i = n - 1;
> +  double ch = c[i][0] + *l, cl = ((c[i][0] - ch) + *l) + c[i][1];
> +  while (--i >= 0)
> +    {
> +      ch = muldd (xh, xl, ch, cl, &cl);
> +      double th = ch + c[i][0], tl = (c[i][0] - th) + ch;
> +      ch = th;
> +      cl += tl + c[i][1];
> +    }
> +  *l = cl;
> +  return ch;
> +}

These could be moved to a common header, but that would be a CORE-MATH
style decision.

> +      double x2h = x * x, x2l = fma (x, x, -x2h);
> +      double x3h = x2h * x, sl;
> +      if (__glibc_unlikely (u < 0x3f93000000000000))
> +	{ // |x| < 0x1.3p-6
> +	  if (__glibc_unlikely (u < 0x3f30000000000000))
> +	    { // |x| < 0x1p-12
> +	      if (__glibc_unlikely (u < 0x3e5a000000000000))
> +		{ // |x| < 0x1.ap-26

More bare hex values (UL or UINT64_C here).  There are more but I'll
refrain from pointing them each out.

> +    static
> +    __attribute__ ((noinline)) double as_asinh_database (double x, double f)

style: 

> +    static __attribute__ ((noinline))
> +    double as_asinh_database (double x, double f)




More information about the Libc-alpha mailing list