diff options
author | Joseph Myers <joseph@codesourcery.com> | 2016-05-26 22:58:36 +0000 |
---|---|---|
committer | Joseph Myers <joseph@codesourcery.com> | 2016-05-26 22:58:36 +0000 |
commit | 98c9c9d9ca6c1eb8e30fe449b1e1121b8c498715 (patch) | |
tree | 3d8ac5444e4c4bbe885f4ca0bd9327aa02d0a3b6 /sysdeps/ieee754 | |
parent | d73e7bdb3a9284eb437b6cd84923658e25f922f2 (diff) | |
download | glibc-98c9c9d9ca6c1eb8e30fe449b1e1121b8c498715.zip glibc-98c9c9d9ca6c1eb8e30fe449b1e1121b8c498715.tar.gz glibc-98c9c9d9ca6c1eb8e30fe449b1e1121b8c498715.tar.bz2 |
Fix ldbl-128ibm sqrtl (sNaN) (bug 20153).
The ldbl-128ibm implementation of sqrtl wrongly returns an sNaN for
signaling NaN arguments. This patch fixes it to quiet its argument,
using the same x * x + x return for infinities and NaNs as the dbl-64
implementation uses to ensure that +Inf maps to +Inf while -Inf and
NaN map to NaN.
Tested for powerpc.
[BZ #20153]
* sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c (__ieee754_sqrtl): Return
x * x + x for infinities and NaNs.
Diffstat (limited to 'sysdeps/ieee754')
-rw-r--r-- | sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c | 8 |
1 files changed, 3 insertions, 5 deletions
diff --git a/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c b/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c index 96845fe..51365d6 100644 --- a/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c +++ b/sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c @@ -91,11 +91,9 @@ long double __ieee754_sqrtl(long double x) return c.x * i; } else { - if (k>=INT64_C(0x7ff0000000000000)) { - if (a.i[0] == INT64_C(0xfff0000000000000)) - return (big1-big1)/(big-big); /* sqrt (-Inf) = NaN. */ - return x; /* sqrt (NaN) = NaN, sqrt (+Inf) = +Inf. */ - } + if (k>=INT64_C(0x7ff0000000000000)) + /* sqrt (-Inf) = NaN, sqrt (NaN) = NaN, sqrt (+Inf) = +Inf. */ + return x * x + x; if (x == 0) return x; if (x < 0) return (big1-big1)/(big-big); return tm256*__ieee754_sqrtl(x*t512); |