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.
This commit is contained in:
parent
d73e7bdb3a
commit
98c9c9d9ca
@ -1,5 +1,9 @@
|
|||||||
2016-05-26 Joseph Myers <joseph@codesourcery.com>
|
2016-05-26 Joseph Myers <joseph@codesourcery.com>
|
||||||
|
|
||||||
|
[BZ #20153]
|
||||||
|
* sysdeps/ieee754/ldbl-128ibm/e_sqrtl.c (__ieee754_sqrtl): Return
|
||||||
|
x * x + x for infinities and NaNs.
|
||||||
|
|
||||||
[BZ #20151]
|
[BZ #20151]
|
||||||
* sysdeps/ieee754/ldbl-128/e_j0l.c (__ieee754_j0l): Add NaN
|
* sysdeps/ieee754/ldbl-128/e_j0l.c (__ieee754_j0l): Add NaN
|
||||||
argument to itself before returning result.
|
argument to itself before returning result.
|
||||||
|
@ -91,11 +91,9 @@ long double __ieee754_sqrtl(long double x)
|
|||||||
return c.x * i;
|
return c.x * i;
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
if (k>=INT64_C(0x7ff0000000000000)) {
|
if (k>=INT64_C(0x7ff0000000000000))
|
||||||
if (a.i[0] == INT64_C(0xfff0000000000000))
|
/* sqrt (-Inf) = NaN, sqrt (NaN) = NaN, sqrt (+Inf) = +Inf. */
|
||||||
return (big1-big1)/(big-big); /* sqrt (-Inf) = NaN. */
|
return x * x + x;
|
||||||
return x; /* sqrt (NaN) = NaN, sqrt (+Inf) = +Inf. */
|
|
||||||
}
|
|
||||||
if (x == 0) return x;
|
if (x == 0) return x;
|
||||||
if (x < 0) return (big1-big1)/(big-big);
|
if (x < 0) return (big1-big1)/(big-big);
|
||||||
return tm256*__ieee754_sqrtl(x*t512);
|
return tm256*__ieee754_sqrtl(x*t512);
|
||||||
|
Loading…
Reference in New Issue
Block a user