This is the mail archive of the
libc-alpha@sourceware.org
mailing list for the glibc project.
Re: Fix ldbl-128 erfl spurious underflows (bug 16287)
- From: Andreas Jaeger <aj at suse dot com>
- To: "Joseph S. Myers" <joseph at codesourcery dot com>, libc-alpha at sourceware dot org
- Date: Tue, 24 Jun 2014 22:44:25 +0200
- Subject: Re: Fix ldbl-128 erfl spurious underflows (bug 16287)
- Authentication-results: sourceware.org; auth=none
- References: <Pine dot LNX dot 4 dot 64 dot 1406242024001 dot 21652 at digraph dot polyomino dot org dot uk>
On 06/24/2014 10:24 PM, Joseph S. Myers wrote:
> This patch fixes bug 16287, spurious underflows from ldbl-128 erfl
> arising from it calling erfcl for arguments with absolute value at
> least 1.0, although for large positive arguments erfcl correctly
> underflows but erfl shouldn't. The fix is simply to avoid calling
> erfcl, and just return 1, for arguments above a cut-off large enough
> that erfl correctly rounds to-nearest as 1 but not so large that erfcl
> underflows.
>
> Tested mips64. Also tested x86_64 and x86 to confirm the new tests
> (taken from the tests of erfc) don't cause any problems there; no ulps
> updates needed.
>
> (auto-libm-test-out diffs omitted below.)
>
> 2014-06-24 Joseph Myers <joseph@codesourcery.com>
>
> [BZ #16287]
> * sysdeps/ieee754/ldbl-128/s_erfl.c (__erfl): Return 1 without
> calling __erfcl for arguments at least 16.
> * math/auto-libm-test-in: Add more tests of erf.
> * math/auto-libm-test-out: Regenerated.
>
> diff --git a/math/auto-libm-test-in b/math/auto-libm-test-in
> index 4eaa013..79d276c 100644
> --- a/math/auto-libm-test-in
> +++ b/math/auto-libm-test-in
> @@ -803,6 +803,16 @@ erf 0x1.c5bf94p-127
> erf 0x3.8b7fa8p-128
> erf -0x3.8b7f12369ded8p-1024
> erf 0x3.8b7f12369ded5518p-16384
> +erf 26.0
> +erf 28.0
> +erf 100
> +erf 106
> +erf 106.5
> +erf 106.625
> +erf 107
> +erf 108
> +erf 1000
> +erf max
>
> erfc 0.0
> erfc -0
> diff --git a/sysdeps/ieee754/ldbl-128/s_erfl.c b/sysdeps/ieee754/ldbl-128/s_erfl.c
> index 35ca8c1..f44d481 100644
> --- a/sysdeps/ieee754/ldbl-128/s_erfl.c
> +++ b/sysdeps/ieee754/ldbl-128/s_erfl.c
> @@ -769,6 +769,8 @@ __erfl (long double x)
>
> if (ix >= 0x3fff0000) /* |x| >= 1.0 */
> {
> + if (ix >= 0x40030000 && sign > 0)
> + return one;
Could you add a comment on this, please?
Fine with this change,
Andreas
> y = __erfcl (x);
> return (one - y);
> /* return (one - __erfcl (x)); */
>
--
Andreas Jaeger aj@{suse.com,opensuse.org} Twitter/Identica: jaegerandi
SUSE LINUX Products GmbH, Maxfeldstr. 5, 90409 Nürnberg, Germany
GF: Jeff Hawn,Jennifer Guild,Felix Imendörffer,HRB16746 (AG Nürnberg)
GPG fingerprint = 93A3 365E CE47 B889 DF7F FED1 389A 563C C272 A126