diff options
Diffstat (limited to 'sysdeps/ieee754/dbl-64')
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_j1.c | 13 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_jn.c | 5 |
2 files changed, 16 insertions, 2 deletions
diff --git a/sysdeps/ieee754/dbl-64/e_j1.c b/sysdeps/ieee754/dbl-64/e_j1.c index 653f33abe1..26ffdfe282 100644 --- a/sysdeps/ieee754/dbl-64/e_j1.c +++ b/sysdeps/ieee754/dbl-64/e_j1.c @@ -59,6 +59,7 @@ */ #include <errno.h> +#include <float.h> #include <math.h> #include <math_private.h> @@ -124,8 +125,16 @@ __ieee754_j1 (double x) } if (__glibc_unlikely (ix < 0x3e400000)) /* |x|<2**-27 */ { - if (huge + x > one) - return 0.5 * x; /* inexact if x!=0 necessary */ + if (huge + x > one) /* inexact if x!=0 necessary */ + { + double ret = 0.5 * x; + if (fabs (ret) < DBL_MIN) + { + double force_underflow = ret * ret; + math_force_eval (force_underflow); + } + return ret; + } } z = x * x; r1 = z * R[0]; z2 = z * z; diff --git a/sysdeps/ieee754/dbl-64/e_jn.c b/sysdeps/ieee754/dbl-64/e_jn.c index b0ddd5e841..ccef2dcd80 100644 --- a/sysdeps/ieee754/dbl-64/e_jn.c +++ b/sysdeps/ieee754/dbl-64/e_jn.c @@ -246,6 +246,11 @@ __ieee754_jn (int n, double x) } if (ret == 0) ret = __copysign (DBL_MIN, ret) * DBL_MIN; + else if (fabs (ret) < DBL_MIN) + { + double force_underflow = ret * ret; + math_force_eval (force_underflow); + } return ret; } strong_alias (__ieee754_jn, __jn_finite) |