[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