2003-12-28 Andreas Jaeger <aj@suse.de>
+ * sysdeps/ieee754/dbl-64/e_j0.c (__ieee754_y0): Raise only
+ overflow for 0 as argument. Raise Invalid exception for negative
+ args.
+ * sysdeps/ieee754/dbl-64/e_jn.c (__ieee754_yn): Likewise.
+ * sysdeps/ieee754/dbl-64/e_j1.c (__ieee754_y0): Likewise.
+ * sysdeps/ieee754/ldb-128/e_jnl.c (__ieee754_ynl): Likewise.
+ * sysdeps/ieee754/ldb-128/e_j0l.c (__ieee754_y0l): Likewise.
+ * sysdeps/ieee754/ldb-128/e_j1l.c (__ieee754_y1l): Likewise.
+ * sysdeps/ieee754/ldb-96/e_jnl.c (__ieee754_ynl): Likewise.
+ * sysdeps/ieee754/ldb-96/e_j0l.c (__ieee754_y0l): Likewise.
+ * sysdeps/ieee754/ldb-96/e_j1l.c (__ieee754_y1l): Likewise.
+ * sysdeps/ieee754/flt-32/e_jnf.c (__ieee754_ynf): Likewise.
+ * sysdeps/ieee754/flt-32/e_j0f.c (__ieee754_y0f): Likewise.
+ * sysdeps/ieee754/flt-32/e_j1f.c (__ieee754_y1f): Likewise.
+
+ * math/libm-test.inc (yn_test): Expect invalid exception for
+ negative arguments.
+ (y0_test): Likewise.
+ (y1_test): Likewise.
+
* sysdeps/ieee754/dbl-64/e_exp.c (__ieee754_exp): Do not raise
execptions for exp(NaN).
EXTRACT_WORDS(hx,lx,x);
ix = 0x7fffffff&hx;
- /* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0 */
+ /* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0, y0(0) is -inf. */
if(ix>=0x7ff00000) return one/(x+x*x);
- if((ix|lx)==0) return -one/zero;
- if(hx<0) return zero/zero;
+ if((ix|lx)==0) return -HUGE_VAL+x; /* -inf and overflow exception. */
+ if(hx<0) return zero/(zero*x);
if(ix >= 0x40000000) { /* |x| >= 2.0 */
/* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
* where x0 = x-pi/4
ix = 0x7fffffff&hx;
/* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
if(ix>=0x7ff00000) return one/(x+x*x);
- if((ix|lx)==0) return -one/zero;
- if(hx<0) return zero/zero;
+ if((ix|lx)==0) return -HUGE_VAL+x; /* -inf and overflow exception. */;
+ if(hx<0) return zero/(zero*x);
if(ix >= 0x40000000) { /* |x| >= 2.0 */
__sincos (x, &s, &c);
ss = -s-c;
* of order n
*
* Special cases:
- * y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
+ * y0(0)=y1(0)=yn(n,0) = -inf with overflow signal;
* y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
* Note 2. About jn(n,x), yn(n,x)
* For n=0, j0(x) is called,
ix = 0x7fffffff&hx;
/* if Y(n,NaN) is NaN */
if((ix|((u_int32_t)(lx|-lx))>>31)>0x7ff00000) return x+x;
- if((ix|lx)==0) return -one/zero;
- if(hx<0) return zero/zero;
+ if((ix|lx)==0) return -HUGE_VAL+x; /* -inf and overflow exception. */;
+ if(hx<0) return zero/(zero*x);
sign = 1;
if(n<0){
n = -n;
GET_FLOAT_WORD(hx,x);
ix = 0x7fffffff&hx;
- /* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0 */
+ /* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0, y0(0) is -inf. */
if(ix>=0x7f800000) return one/(x+x*x);
- if(ix==0) return -one/zero;
- if(hx<0) return zero/zero;
+ if(ix==0) return -HUGE_VALF+x; /* -inf and overflow exception. */
+ if(hx<0) return zero/(zero*x);
if(ix >= 0x40000000) { /* |x| >= 2.0 */
/* y0(x) = sqrt(2/(pi*x))*(p0(x)*sin(x0)+q0(x)*cos(x0))
* where x0 = x-pi/4
ix = 0x7fffffff&hx;
/* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
if(ix>=0x7f800000) return one/(x+x*x);
- if(ix==0) return -one/zero;
- if(hx<0) return zero/zero;
+ if(ix==0) return -HUGE_VALF+x; /* -inf and overflow exception. */
+ if(hx<0) return zero/(zero*x);
if(ix >= 0x40000000) { /* |x| >= 2.0 */
__sincosf (x, &s, &c);
ss = -s-c;
ix = 0x7fffffff&hx;
/* if Y(n,NaN) is NaN */
if(ix>0x7f800000) return x+x;
- if(ix==0) return -one/zero;
- if(hx<0) return zero/zero;
+ if(ix==0) return -HUGE_VALF+x; /* -inf and overflow exception. */
+ if(hx<0) return zero/(zero*x);
sign = 1;
if(n<0){
n = -n;
if (x <= 0.0L)
{
if (x < 0.0L)
- return (zero / zero);
- return 1.0L / zero;
+ return (zero / (zero * x));
+ return -HUGE_VALL + x;
}
xx = fabsl (x);
if (xx <= 2.0L)
if (x <= 0.0L)
{
if (x < 0.0L)
- return (zero / zero);
- return -1.0L / zero;
+ return (zero / (zero * x));
+ return -HUGE_VALL + x;
}
xx = fabsl (x);
if (xx <= 2.0L)
if (x <= 0.0L)
{
if (x == 0.0L)
- return -one / zero;
+ return -HUGE_VALL + x;
if (se & 0x80000000)
- return zero / zero;
+ return zero / (zero * x);
}
sign = 1;
if (n < 0)
ix = se & 0x7fff;
/* Y0(NaN) is NaN, y0(-inf) is Nan, y0(inf) is 0 */
if (se & 0x8000)
- return zero / zero;
+ return zero / (zero * x);
if (ix >= 0x7fff)
return one / (x + x * x);
if ((i0 | i1) == 0)
- return -one / zero;
+ return -HUGE_VALL + x; /* -inf and overflow exception. */
if (ix >= 0x4000)
{ /* |x| >= 2.0 */
ix = se & 0x7fff;
/* if Y1(NaN) is NaN, Y1(-inf) is NaN, Y1(inf) is 0 */
if (se & 0x8000)
- return zero / zero;
+ return zero / (zero * x);
if (ix >= 0x7fff)
return one / (x + x * x);
if ((i0 | i1) == 0)
- return -one / zero;
+ return -HUGE_VALL + x; /* -inf and overflow exception. */
if (ix >= 0x4000)
{ /* |x| >= 2.0 */
__sincosl (x, &s, &c);
* of order n
*
* Special cases:
- * y0(0)=y1(0)=yn(n,0) = -inf with division by zero signal;
+ * y0(0)=y1(0)=yn(n,0) = -inf with overflow signal;
* y0(-ve)=y1(-ve)=yn(n,-ve) are NaN with invalid signal.
* Note 2. About jn(n,x), yn(n,x)
* For n=0, j0(x) is called,
if ((ix == 0x7fff) && ((i0 & 0x7fffffff) != 0))
return x + x;
if ((ix | i0 | i1) == 0)
- return -one / zero;
+ return -HUGE_VALL + x; /* -inf and overflow exception. */
if (se & 0x8000)
- return zero / zero;
+ return zero / (zero * x);
sign = 1;
if (n < 0)
{