Skip to content

Commit

Permalink
Fix spurious undeflow for ldbl-128ibm erfl
Browse files Browse the repository at this point in the history
For values higher than 25.6283 erflc underflow, so adjust erfl
to return a constant value based argument sign.
  • Loading branch information
Adhemerval Zanella committed Jun 5, 2012
1 parent 34ae0b3 commit 6043738
Show file tree
Hide file tree
Showing 2 changed files with 23 additions and 3 deletions.
5 changes: 5 additions & 0 deletions ChangeLog
Original file line number Diff line number Diff line change
@@ -1,3 +1,8 @@
2012-06-05 Adhemerval Zanella <azanella@linux.vnet.ibm.com>

* sysdeps/ieee754/ldbl-128ibm/s_erfl.c: Fix spurious underflow for
values higher than 25.6283.

2012-06-04 Adhemerval Zanella <azanella@linux.vnet.ibm.com>

* sysdeps/ieee754/ldbl-128ibm/e_fmodl.c (__ieee754_fmodl): Fix
Expand Down
21 changes: 18 additions & 3 deletions sysdeps/ieee754/ldbl-128ibm/s_erfl.c
Original file line number Diff line number Diff line change
Expand Up @@ -72,6 +72,8 @@
* z=1/x^2
* The interval is partitioned into several segments
* of width 1/8 in 1/x.
* erf(x) = 1.0 - erfc(x) if x < 25.6283 else
* erf(x) = sign(x)*(1.0 - tiny)
*
* Note1:
* To compute exp(-x*x-0.5625+R/S), let s be a single
Expand All @@ -85,6 +87,9 @@
* erfc(x) ~ ---------- * ( 1 + Poly(1/x^2) )
* x*sqrt(pi)
*
* Note3:
* For x higher than 25.6283, erf(x) underflows.
*
* 5. For inf > x >= 107
* erf(x) = sign(x) *(1 - tiny) (raise inexact)
* erfc(x) = tiny*tiny (raise underflow) if x > 0
Expand Down Expand Up @@ -770,9 +775,19 @@ __erfl (long double x)

if (ix >= 0x3ff00000) /* |x| >= 1.0 */
{
y = __erfcl (x);
return (one - y);
/* return (one - __erfcl (x)); */
if (ix >= 0x4039A0DE)
{
/* __erfcl (x) underflows if x > 25.6283 */
if (sign)
return one-tiny;
else
return tiny-one;
}
else
{
y = __erfcl (x);
return (one - y);
}
}
u.parts32.w0 = ix;
a = u.value;
Expand Down

0 comments on commit 6043738

Please sign in to comment.