diff options
-rw-r--r-- | ChangeLog | 6 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | sysdeps/ieee754/ldbl-128/s_expm1l.c | 15 |
3 files changed, 19 insertions, 4 deletions
@@ -1,3 +1,9 @@ +2015-07-01 Joseph Myers <joseph@codesourcery.com> + + [BZ #18619] + * sysdeps/ieee754/ldbl-128/s_expm1l.c (__expm1l): Force underflow + and return argument in case of subnormal argument. + 2015-07-01 Martin Sebor <msebor@redhat.com> [BZ #18435] @@ -25,7 +25,7 @@ Version 2.22 18496, 18497, 18498, 18502, 18507, 18512, 18513, 18519, 18520, 18522, 18527, 18528, 18529, 18530, 18532, 18533, 18534, 18536, 18539, 18540, 18542, 18544, 18545, 18546, 18547, 18549, 18553, 18558, 18569, 18583, - 18585, 18586, 18593, 18594, 18602, 18612, 18613. + 18585, 18586, 18593, 18594, 18602, 18612, 18613, 18619. * Cache information can be queried via sysconf() function on s390 e.g. with _SC_LEVEL1_ICACHE_SIZE as argument. diff --git a/sysdeps/ieee754/ldbl-128/s_expm1l.c b/sysdeps/ieee754/ldbl-128/s_expm1l.c index f708af504c..573d00be57 100644 --- a/sysdeps/ieee754/ldbl-128/s_expm1l.c +++ b/sysdeps/ieee754/ldbl-128/s_expm1l.c @@ -137,9 +137,18 @@ __expm1l (long double x) if (x < minarg) return (4.0/big - 1.0L); - /* Avoid internal underflow when result does not underflow. */ - if (fabsl (x) < 0x1p-113L && fabsl (x) >= LDBL_MIN) - return x; + /* Avoid internal underflow when result does not underflow, while + ensuring underflow (without returning a zero of the wrong sign) + when the result does underflow. */ + if (fabsl (x) < 0x1p-113L) + { + if (fabsl (x) < LDBL_MIN) + { + long double force_underflow = x * x; + math_force_eval (force_underflow); + } + return x; + } /* Express x = ln 2 (k + remainder), remainder not exceeding 1/2. */ xx = C1 + C2; /* ln 2. */ |