aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSzabolcs Nagy <szabolcs.nagy@arm.com>2017-10-03 18:12:42 +0100
committerSzabolcs Nagy <szabolcs.nagy@arm.com>2017-10-04 10:15:12 +0100
commit86c27ade1e44e29922d33676f950f7334edb37a7 (patch)
treef1a56c25057b1af6d66df83321beb906c1914fd6
parent8f8f8ef7aba40ef883291e4c4d95a419c3327d70 (diff)
downloadglibc-86c27ade1e44e29922d33676f950f7334edb37a7.zip
glibc-86c27ade1e44e29922d33676f950f7334edb37a7.tar.gz
glibc-86c27ade1e44e29922d33676f950f7334edb37a7.tar.bz2
[BZ #22244] Fix yn(n,0) without SVID wrapper
Without SVID compat wrapper yn(n,0) and ynf(n,0) does not raise the divide-by-zero excpetion and it may return inf with the wrong sign for n < 0. [BZ #22244] * sysdeps/ieee754/dbl-64/e_jn.c (__ieee754_yn): Fix x == 0 case. * sysdeps/ieee754/flt-32/e_jnf.c (__ieee754_ynf): Likewise.
-rw-r--r--ChangeLog6
-rw-r--r--sysdeps/ieee754/dbl-64/e_jn.c10
-rw-r--r--sysdeps/ieee754/flt-32/e_jnf.c6
3 files changed, 14 insertions, 8 deletions
diff --git a/ChangeLog b/ChangeLog
index 6161509..55295ba 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,11 @@
2017-10-04 Szabolcs Nagy <szabolcs.nagy@arm.com>
+ [BZ #22244]
+ * sysdeps/ieee754/dbl-64/e_jn.c (__ieee754_yn): Fix x == 0 case.
+ * sysdeps/ieee754/flt-32/e_jnf.c (__ieee754_ynf): Likewise.
+
+2017-10-04 Szabolcs Nagy <szabolcs.nagy@arm.com>
+
[BZ #22243]
* sysdeps/ieee754/dbl-64/wordsize-64/e_log10.c (__ieee754_log10): Use fabs.
* sysdeps/ieee754/dbl-64/wordsize-64/e_log2.c (__ieee754_log2): Likewise.
diff --git a/sysdeps/ieee754/dbl-64/e_jn.c b/sysdeps/ieee754/dbl-64/e_jn.c
index 3ac91df..a244df0 100644
--- a/sysdeps/ieee754/dbl-64/e_jn.c
+++ b/sysdeps/ieee754/dbl-64/e_jn.c
@@ -268,11 +268,6 @@ __ieee754_yn (int n, double x)
/* if Y(n,NaN) is NaN */
if (__glibc_unlikely ((ix | ((uint32_t) (lx | -lx)) >> 31) > 0x7ff00000))
return x + x;
- if (__glibc_unlikely ((ix | lx) == 0))
- return -HUGE_VAL + x;
- /* -inf and overflow exception. */;
- if (__glibc_unlikely (hx < 0))
- return zero / (zero * x);
sign = 1;
if (n < 0)
{
@@ -281,6 +276,11 @@ __ieee754_yn (int n, double x)
}
if (n == 0)
return (__ieee754_y0 (x));
+ if (__glibc_unlikely ((ix | lx) == 0))
+ return -sign / zero;
+ /* -inf and overflow exception. */;
+ if (__glibc_unlikely (hx < 0))
+ return zero / (zero * x);
{
SET_RESTORE_ROUND (FE_TONEAREST);
if (n == 1)
diff --git a/sysdeps/ieee754/flt-32/e_jnf.c b/sysdeps/ieee754/flt-32/e_jnf.c
index 82b9ba3..4b78ece 100644
--- a/sysdeps/ieee754/flt-32/e_jnf.c
+++ b/sysdeps/ieee754/flt-32/e_jnf.c
@@ -194,15 +194,15 @@ __ieee754_ynf(int n, float x)
ix = 0x7fffffff&hx;
/* if Y(n,NaN) is NaN */
if(__builtin_expect(ix>0x7f800000, 0)) return x+x;
- if(__builtin_expect(ix==0, 0))
- return -HUGE_VALF+x; /* -inf and overflow exception. */
- if(__builtin_expect(hx<0, 0)) return zero/(zero*x);
sign = 1;
if(n<0){
n = -n;
sign = 1 - ((n&1)<<1);
}
if(n==0) return(__ieee754_y0f(x));
+ if(__builtin_expect(ix==0, 0))
+ return -sign/zero;
+ if(__builtin_expect(hx<0, 0)) return zero/(zero*x);
SET_RESTORE_ROUNDF (FE_TONEAREST);
if(n==1) {
ret = sign*__ieee754_y1f(x);