[PATCH] Fix spurious underflow exceptions for Bessel functions for double(from glibc bug 14155)

Corinna Vinschen vinschen@redhat.com
Thu Mar 26 11:27:17 GMT 2020


On Mar 25 11:18, Keith Packard via Newlib wrote:
> From: "Joseph S. Myers" <joseph@codesourcery.com>
> 
> 	This fix comes from glibc, from files which originated from
> 	the same place as the newlib files. Those files in glibc carry
> 	the same license as the newlib files.
> 
> Bug 14155 is spurious underflow exceptions from Bessel functions for
> large arguments.  (The correct results for large x are roughly
> constant * sin or cos (x + constant) / sqrt (x), so no underflow
> exceptions should occur based on the final result.)
> 
> There are various places underflows may occur in the intermediate
> calculations that cause the failures listed in that bug.  This patch
> fixes problems for the double version where underflows occur in
> calculating the intermediate functions P and Q (in particular, x**-12
> gets computed while calculating Q).  Appropriate approximations are
> used for P and Q for arguments at least 0x1p28 and above to avoid the
> underflows.
> 
> For sufficiently large x - 0x1p129 and above - the code already has a
> cut-off to avoid calculating P and Q at all, which means the
> approximations -0.125 / x and 0.375 / x can't themselves cause
> underflows calculating Q.  This cut-off is heuristically reasonable
> for the point beyond which Q can be neglected (based on expecting
> around 0x1p-64 to be the least absolute value of sin or cos for large
> arguments representable in double).
> 
> The float versions use a cut-off 0x1p17, which is less heuristically
> justifiable but should still only affect values near zeroes of the
> Bessel functions where these implementations are intrinsically
> inaccurate anyway (bugs 14469-14472), and should serve to avoid
> underflows (the float underflow for jn in bug 14155 probably comes
> from the recurrence to compute jn).  ldbl-96 uses 0x1p129, which may
> not really be enough heuristically (0x1p143 or so might be safer - 143
> = 64 + 79, number of mantissa bits plus total number of significant
> bits in representation) but again should avoid underflows and only
> affect values where the code is substantially inaccurate anyway.
> ldbl-128 and ldbl-128ibm share a completely different implementation
> with no such cut-off, which I propose to fix separately.
> 
> Signed-off-by: Keith Packard <keithp@keithp.com>
> ---
>  newlib/libm/math/e_j0.c  | 6 ++++--
>  newlib/libm/math/e_j1.c  | 6 ++++--
>  newlib/libm/math/ef_j0.c | 6 +++---
>  newlib/libm/math/ef_j1.c | 4 ++--
>  4 files changed, 13 insertions(+), 9 deletions(-)

Pushed.


Thanks,
Corinna

-- 
Corinna Vinschen
Cygwin Maintainer
Red Hat
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 833 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/newlib/attachments/20200326/ba44770d/attachment.sig>


More information about the Newlib mailing list