summaryrefslogtreecommitdiff
path: root/sysdeps/ieee754/ldbl-128ibm/s_erfl.c
diff options
context:
space:
mode:
Diffstat (limited to 'sysdeps/ieee754/ldbl-128ibm/s_erfl.c')
-rw-r--r--sysdeps/ieee754/ldbl-128ibm/s_erfl.c16
1 files changed, 11 insertions, 5 deletions
diff --git a/sysdeps/ieee754/ldbl-128ibm/s_erfl.c b/sysdeps/ieee754/ldbl-128ibm/s_erfl.c
index 95dc415845..f55e8b7879 100644
--- a/sysdeps/ieee754/ldbl-128ibm/s_erfl.c
+++ b/sysdeps/ieee754/ldbl-128ibm/s_erfl.c
@@ -102,6 +102,7 @@
*/
#include <errno.h>
+#include <float.h>
#include <math.h>
#include <math_private.h>
#include <math_ldbl_opt.h>
@@ -149,9 +150,7 @@ tiny = 1e-300L,
one = 1.0L,
two = 2.0L,
/* 2/sqrt(pi) - 1 */
- efx = 1.2837916709551257389615890312154517168810E-1L,
- /* 8 * (2/sqrt(pi) - 1) */
- efx8 = 1.0270333367641005911692712249723613735048E0L;
+ efx = 1.2837916709551257389615890312154517168810E-1L;
/* erf(x) = x + x R(x^2)
@@ -801,10 +800,17 @@ __erfl (long double x)
if (ix < 0x00800000)
{
/* erf (-0) = -0. Unfortunately, for IBM extended double
- 0.125 * (8.0 * x + efx8 * x) for x = -0 evaluates to 0. */
+ 0.0625 * (16.0 * x + (16.0 * efx) * x) for x = -0
+ evaluates to 0. */
if (x == 0)
return x;
- return 0.125 * (8.0 * x + efx8 * x); /*avoid underflow */
+ long double ret = 0.0625 * (16.0 * x + (16.0 * efx) * x);
+ if (fabsl (ret) < LDBL_MIN)
+ {
+ long double force_underflow = ret * ret;
+ math_force_eval (force_underflow);
+ }
+ return ret;
}
return x + efx * x;
}