[PATCH v2 6/8] math: Consolidated common definition/data for cosh/sinh/tanh

DJ Delorie dj@redhat.com
Thu Mar 12 02:27:33 GMT 2026


Adhemerval Zanella <adhemerval.zanella@linaro.org> writes:
> diff --git a/sysdeps/ieee754/dbl-64/e_cosh_data.c b/sysdeps/ieee754/dbl-64/e_cosh_data.c

> +/* Correctly rounded hyperbolic cosine for binary64 values.

This comment is not quite correct for this file.  The data files should
say they're *for* computing those, but the comment implies that these
files *do* the computing.

> +/*
> +  The function sinh(x)/cosh(x) is approximated by a minimax polynomial
> +  cosh(x)~1+x^2*P(x^2) for |x|<0.125. For other arguments the
> +  identity cosh(x)=(exp(|x|)+exp(-|x|))/2 is used. For |x|<5 both
> +  exponents are calculated with slightly higher precision than
> +  double. For 5<|x|<36.736801 the exp(-|x|) is rather small and is
> +  calculated with double precision but exp(|x|) is calculated with
> +  higher than double precision. For 36.736801<|x|<710.47586
> +  exp(-|x|) becomes too small and only exp(|x|) is calculated.
> + */

Should this comment be here, or in the source file that uses this data?

> +const double __sinhcosh_t0[][2]
> +    = { { 0x0p+0, 0x1p+0 },
> +	{ -0x1.19083535b085ep-56, 0x1.02c9a3e778061p+0 },
> +	{ 0x1.74853f3a5931ep-55, 0x1.fa7c1819e90d8p+0 } };
> +
> +const double __sinhcosh_t1[][2] = {
> +  { 0x0p+0, 0x1p+0 },
> +  { 0x1.ae8e38c59c72ap-54, 0x1.000b175effdc7p+0 },
> +  { -0x1.7b5d0d58ea8f4p-58, 0x1.00162f3904052p+0 },
> +  { 0x1.e47120223468p-54, 0x1.02be6e199c811p+0 },
> +};

Heh, the formatting inconsistency got faithfully copied ;-)

> +extern const double __sinh_data_db[49][3] attribute_hidden;

I assume the 49 is correct, but is it needed?  We use array_length()
elsewhere to discover this value, and if the table length ever changes
(I hope not ;) this is just one more place that needs to be consistent.

> +extern const double __tanh_data_db[12][3] attribute_hidden;

Here too.

> @@ -164,144 +139,6 @@ SECTION
>  double
>  __tanh (double x)
>  {
> -  /*
> -    The function tanh(x) is approximated by minimax polynomial for
> -    |x|<0.25.  For other values we use this identity tanh(|x|) = 1 -
> -    2*exp(-2*|x|)/(1 + exp(-2*|x|)).  For large |x|>3.683 the term
> -    2*exp(-2*|x|)/(1 + exp(-2*|x|)) becomes small and we can use less
> -    precise formula for exponential.
> -  */

Likewise, this comment should have remained here.



More information about the Libc-alpha mailing list