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:
Joseph Myers 2016-05-26 22:58:36 +00:00
parent d73e7bdb3a
commit 98c9c9d9ca
2 changed files with 7 additions and 5 deletions

View File

@ -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.

View File

@ -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);