[BZ,#22244] Fix yn(n,0) without SVID wrapper
Commit Message
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.
2017-10-03 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.
Comments
On 03/10/17 18:28, Szabolcs Nagy wrote:
> 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.
>
> 2017-10-03 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.
>
sorry, wrong patch (this one breaks yn(n,-0))
@@ -268,8 +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);
@@ -281,6 +279,8 @@ __ieee754_yn (int n, double x)
}
if (n == 0)
return (__ieee754_y0 (x));
+ if (__glibc_unlikely ((ix | lx) == 0))
+ return -sign / zero;
{
SET_RESTORE_ROUND (FE_TONEAREST);
if (n == 1)
@@ -194,8 +194,6 @@ __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){
@@ -203,6 +201,8 @@ __ieee754_ynf(int n, float x)
sign = 1 - ((n&1)<<1);
}
if(n==0) return(__ieee754_y0f(x));
+ if(__builtin_expect(ix==0, 0))
+ return -sign/zero;
SET_RESTORE_ROUNDF (FE_TONEAREST);
if(n==1) {
ret = sign*__ieee754_y1f(x);