fix for bug #8112, sr=brendan, r=beard

This commit is contained in:
beard%netscape.com 2001-04-18 03:38:58 +00:00
parent 6537de8f6d
commit 9d02c9eb11
28 changed files with 177 additions and 148 deletions

View File

@ -117,10 +117,10 @@ static double zero = 0.0; /* used as const */
#ifdef __STDC__
double __kernel_standard(double x, double y, int type)
double __kernel_standard(double x, double y, int type, int *err)
#else
double __kernel_standard(x,y,type)
double x,y; int type;
double __kernel_standard(x,y,type, err)
double x,y; int type;int *err;
#endif
{
struct exception exc;
@ -134,6 +134,8 @@ static double zero = 0.0; /* used as const */
inf = u.d;
#endif
*err = 0;
#ifdef _USE_WRITE
(void) fflush(stdout);
#endif
@ -146,12 +148,12 @@ static double zero = 0.0; /* used as const */
exc.name = "acos";
exc.retval = zero;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if(_LIB_VERSION == _SVID_) {
(void) WRITE2("acos: DOMAIN error\n", 19);
}
errno = EDOM;
*err = EDOM;
}
break;
case 2:
@ -160,12 +162,12 @@ static double zero = 0.0; /* used as const */
exc.name = "asin";
exc.retval = zero;
if(_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if(_LIB_VERSION == _SVID_) {
(void) WRITE2("asin: DOMAIN error\n", 19);
}
errno = EDOM;
*err = EDOM;
}
break;
case 3:
@ -176,12 +178,12 @@ static double zero = 0.0; /* used as const */
exc.name = "atan2";
exc.retval = zero;
if(_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if(_LIB_VERSION == _SVID_) {
(void) WRITE2("atan2: DOMAIN error\n", 20);
}
errno = EDOM;
*err = EDOM;
}
break;
case 4:
@ -193,9 +195,9 @@ static double zero = 0.0; /* used as const */
else
exc.retval = HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
errno = ERANGE;
*err = ERANGE;
}
break;
case 5:
@ -207,9 +209,9 @@ static double zero = 0.0; /* used as const */
else
exc.retval = HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
errno = ERANGE;
*err = ERANGE;
}
break;
case 6:
@ -221,9 +223,9 @@ static double zero = 0.0; /* used as const */
else
exc.retval = HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
errno = ERANGE;
*err = ERANGE;
}
break;
case 7:
@ -232,9 +234,9 @@ static double zero = 0.0; /* used as const */
exc.name = "exp";
exc.retval = zero;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
errno = ERANGE;
*err = ERANGE;
}
break;
case 8:
@ -246,12 +248,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = -HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("y0: DOMAIN error\n", 17);
}
errno = EDOM;
*err = EDOM;
}
break;
case 9:
@ -263,12 +265,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = -HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("y0: DOMAIN error\n", 17);
}
errno = EDOM;
*err = EDOM;
}
break;
case 10:
@ -280,12 +282,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = -HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("y1: DOMAIN error\n", 17);
}
errno = EDOM;
*err = EDOM;
}
break;
case 11:
@ -297,12 +299,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = -HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("y1: DOMAIN error\n", 17);
}
errno = EDOM;
*err = EDOM;
}
break;
case 12:
@ -314,12 +316,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = -HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("yn: DOMAIN error\n", 17);
}
errno = EDOM;
*err = EDOM;
}
break;
case 13:
@ -331,12 +333,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = -HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("yn: DOMAIN error\n", 17);
}
errno = EDOM;
*err = EDOM;
}
break;
case 14:
@ -348,9 +350,9 @@ static double zero = 0.0; /* used as const */
else
exc.retval = HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
errno = ERANGE;
*err = ERANGE;
}
break;
case 15:
@ -362,12 +364,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("lgamma: SING error\n", 19);
}
errno = EDOM;
*err = EDOM;
}
break;
case 16:
@ -379,12 +381,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = -HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("log: SING error\n", 16);
}
errno = EDOM;
*err = EDOM;
}
break;
case 17:
@ -396,12 +398,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = -HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("log: DOMAIN error\n", 18);
}
errno = EDOM;
*err = EDOM;
}
break;
case 18:
@ -413,12 +415,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = -HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("log10: SING error\n", 18);
}
errno = EDOM;
*err = EDOM;
}
break;
case 19:
@ -430,12 +432,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = -HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("log10: DOMAIN error\n", 20);
}
errno = EDOM;
*err = EDOM;
}
break;
case 20:
@ -447,7 +449,7 @@ static double zero = 0.0; /* used as const */
if (_LIB_VERSION != _SVID_) exc.retval = 1.0;
else if (!fd_matherr(&exc)) {
(void) WRITE2("pow(0,0): DOMAIN error\n", 23);
errno = EDOM;
*err = EDOM;
}
break;
case 21:
@ -464,9 +466,9 @@ static double zero = 0.0; /* used as const */
if(x<zero&&fd_rint(y)!=y) exc.retval = -HUGE_VAL;
}
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
errno = ERANGE;
*err = ERANGE;
}
break;
case 22:
@ -475,9 +477,9 @@ static double zero = 0.0; /* used as const */
exc.name = "pow";
exc.retval = zero;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
errno = ERANGE;
*err = ERANGE;
}
break;
case 23:
@ -489,12 +491,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = -HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("pow(0,neg): DOMAIN error\n", 25);
}
errno = EDOM;
*err = EDOM;
}
break;
case 24:
@ -506,12 +508,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = zero/zero; /* X/Open allow NaN */
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("neg**non-integral: DOMAIN error\n", 32);
}
errno = EDOM;
*err = EDOM;
}
break;
case 25:
@ -523,9 +525,9 @@ static double zero = 0.0; /* used as const */
else
exc.retval = ( (x>zero) ? HUGE_VAL : -HUGE_VAL);
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
errno = ERANGE;
*err = ERANGE;
}
break;
case 26:
@ -537,12 +539,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = zero/zero;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("sqrt: DOMAIN error\n", 19);
}
errno = EDOM;
*err = EDOM;
}
break;
case 27:
@ -554,12 +556,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = zero/zero;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("fmod: DOMAIN error\n", 20);
}
errno = EDOM;
*err = EDOM;
}
break;
case 28:
@ -568,12 +570,12 @@ static double zero = 0.0; /* used as const */
exc.name = "remainder";
exc.retval = zero/zero;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("remainder: DOMAIN error\n", 24);
}
errno = EDOM;
*err = EDOM;
}
break;
case 29:
@ -582,12 +584,12 @@ static double zero = 0.0; /* used as const */
exc.name = "acosh";
exc.retval = zero/zero;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("acosh: DOMAIN error\n", 20);
}
errno = EDOM;
*err = EDOM;
}
break;
case 30:
@ -596,12 +598,12 @@ static double zero = 0.0; /* used as const */
exc.name = "atanh";
exc.retval = zero/zero;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("atanh: DOMAIN error\n", 20);
}
errno = EDOM;
*err = EDOM;
}
break;
case 31:
@ -610,12 +612,12 @@ static double zero = 0.0; /* used as const */
exc.name = "atanh";
exc.retval = x/zero; /* sign(x)*inf */
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("atanh: SING error\n", 18);
}
errno = EDOM;
*err = EDOM;
}
break;
case 32:
@ -624,9 +626,9 @@ static double zero = 0.0; /* used as const */
exc.name = "scalb";
exc.retval = x > zero ? HUGE_VAL : -HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
errno = ERANGE;
*err = ERANGE;
}
break;
case 33:
@ -635,9 +637,9 @@ static double zero = 0.0; /* used as const */
exc.name = "scalb";
exc.retval = fd_copysign(zero,x);
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
errno = ERANGE;
*err = ERANGE;
}
break;
case 34:
@ -646,13 +648,13 @@ static double zero = 0.0; /* used as const */
exc.name = "j0";
exc.retval = zero;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2(exc.name, 2);
(void) WRITE2(": TLOSS error\n", 14);
}
errno = ERANGE;
*err = ERANGE;
}
break;
case 35:
@ -661,13 +663,13 @@ static double zero = 0.0; /* used as const */
exc.name = "y0";
exc.retval = zero;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2(exc.name, 2);
(void) WRITE2(": TLOSS error\n", 14);
}
errno = ERANGE;
*err = ERANGE;
}
break;
case 36:
@ -676,13 +678,13 @@ static double zero = 0.0; /* used as const */
exc.name = "j1";
exc.retval = zero;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2(exc.name, 2);
(void) WRITE2(": TLOSS error\n", 14);
}
errno = ERANGE;
*err = ERANGE;
}
break;
case 37:
@ -691,13 +693,13 @@ static double zero = 0.0; /* used as const */
exc.name = "y1";
exc.retval = zero;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2(exc.name, 2);
(void) WRITE2(": TLOSS error\n", 14);
}
errno = ERANGE;
*err = ERANGE;
}
break;
case 38:
@ -706,13 +708,13 @@ static double zero = 0.0; /* used as const */
exc.name = "jn";
exc.retval = zero;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2(exc.name, 2);
(void) WRITE2(": TLOSS error\n", 14);
}
errno = ERANGE;
*err = ERANGE;
}
break;
case 39:
@ -721,13 +723,13 @@ static double zero = 0.0; /* used as const */
exc.name = "yn";
exc.retval = zero;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2(exc.name, 2);
(void) WRITE2(": TLOSS error\n", 14);
}
errno = ERANGE;
*err = ERANGE;
}
break;
case 40:
@ -739,9 +741,9 @@ static double zero = 0.0; /* used as const */
else
exc.retval = HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = ERANGE;
*err = ERANGE;
else if (!fd_matherr(&exc)) {
errno = ERANGE;
*err = ERANGE;
}
break;
case 41:
@ -753,12 +755,12 @@ static double zero = 0.0; /* used as const */
else
exc.retval = HUGE_VAL;
if (_LIB_VERSION == _POSIX_)
errno = EDOM;
*err = EDOM;
else if (!fd_matherr(&exc)) {
if (_LIB_VERSION == _SVID_) {
(void) WRITE2("gamma: SING error\n", 18);
}
errno = EDOM;
*err = EDOM;
}
break;
case 42:
@ -770,7 +772,7 @@ static double zero = 0.0; /* used as const */
if (_LIB_VERSION == _IEEE_ ||
_LIB_VERSION == _POSIX_) exc.retval = 1.0;
else if (!fd_matherr(&exc)) {
errno = EDOM;
*err = EDOM;
}
break;
}

View File

@ -65,7 +65,8 @@
z = __ieee754_acos(x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x)) return z;
if(fd_fabs(x)>1.0) {
return __kernel_standard(x,x,1); /* acos(|x|>1) */
int err;
return __kernel_standard(x,x,1,&err); /* acos(|x|>1) */
} else
return z;
#endif

View File

@ -65,7 +65,8 @@
z = __ieee754_acosh(x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x)) return z;
if(x<1.0) {
return __kernel_standard(x,x,29); /* acosh(x<1) */
int err;
return __kernel_standard(x,x,29,&err); /* acosh(x<1) */
} else
return z;
#endif

View File

@ -67,7 +67,8 @@
z = __ieee754_asin(x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x)) return z;
if(fd_fabs(x)>1.0) {
return __kernel_standard(x,x,2); /* asin(|x|>1) */
int err;
return __kernel_standard(x,x,2,&err); /* asin(|x|>1) */
} else
return z;
#endif

View File

@ -66,7 +66,8 @@
z = __ieee754_atan2(y,x);
if(_LIB_VERSION == _IEEE_||fd_isnan(x)||fd_isnan(y)) return z;
if(x==0.0&&y==0.0) {
return __kernel_standard(y,x,3); /* atan2(+-0,+-0) */
int err;
return __kernel_standard(y,x,3,&err); /* atan2(+-0,+-0) */
} else
return z;
#endif

View File

@ -65,10 +65,11 @@
if(_LIB_VERSION == _IEEE_ || fd_isnan(x)) return z;
y = fd_fabs(x);
if(y>=1.0) {
int err;
if(y>1.0)
return __kernel_standard(x,x,30); /* atanh(|x|>1) */
return __kernel_standard(x,x,30,&err); /* atanh(|x|>1) */
else
return __kernel_standard(x,x,31); /* atanh(|x|==1) */
return __kernel_standard(x,x,31,&err); /* atanh(|x|==1) */
} else
return z;
#endif

View File

@ -64,7 +64,8 @@
z = __ieee754_cosh(x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x)) return z;
if(fd_fabs(x)>7.10475860073943863426e+02) {
return __kernel_standard(x,x,5); /* cosh overflow */
int err;
return __kernel_standard(x,x,5,&err); /* cosh overflow */
} else
return z;
#endif

View File

@ -72,10 +72,11 @@ u_threshold= -7.45133219101941108420e+02; /* 0xc0874910, 0xD52D3051 */
z = __ieee754_exp(x);
if(_LIB_VERSION == _IEEE_) return z;
if(fd_finite(x)) {
int err;
if(x>o_threshold)
return __kernel_standard(x,x,6); /* exp overflow */
return __kernel_standard(x,x,6,&err); /* exp overflow */
else if(x<u_threshold)
return __kernel_standard(x,x,7); /* exp underflow */
return __kernel_standard(x,x,7,&err); /* exp underflow */
}
return z;
#endif

View File

@ -65,7 +65,8 @@
z = __ieee754_fmod(x,y);
if(_LIB_VERSION == _IEEE_ ||fd_isnan(y)||fd_isnan(x)) return z;
if(y==0.0) {
return __kernel_standard(x,y,27); /* fmod(x,0) */
int err;
return __kernel_standard(x,y,27,&err); /* fmod(x,0) */
} else
return z;
#endif

View File

@ -69,10 +69,11 @@ extern int signgam;
y = __ieee754_gamma_r(x,&signgam);
if(_LIB_VERSION == _IEEE_) return y;
if(!fd_finite(y)&&fd_finite(x)) {
int err;
if(fd_floor(x)==x&&x<=0.0)
return __kernel_standard(x,x,41); /* gamma pole */
return __kernel_standard(x,x,41,&err); /* gamma pole */
else
return __kernel_standard(x,x,40); /* gamma overflow */
return __kernel_standard(x,x,40,&err); /* gamma overflow */
} else
return y;
#endif

View File

@ -65,10 +65,11 @@
y = __ieee754_gamma_r(x,signgamp);
if(_LIB_VERSION == _IEEE_) return y;
if(!fd_finite(y)&&fd_finite(x)) {
int err;
if(fd_floor(x)==x&&x<=0.0)
return __kernel_standard(x,x,41); /* gamma pole */
return __kernel_standard(x,x,41,&err); /* gamma pole */
else
return __kernel_standard(x,x,40); /* gamma overflow */
return __kernel_standard(x,x,40,&err); /* gamma overflow */
} else
return y;
#endif

View File

@ -64,9 +64,10 @@
double z;
z = __ieee754_hypot(x,y);
if(_LIB_VERSION == _IEEE_) return z;
if((!fd_finite(z))&&fd_finite(x)&&fd_finite(y))
return __kernel_standard(x,y,4); /* hypot overflow */
else
if((!fd_finite(z))&&fd_finite(x)&&fd_finite(y)) {
int err;
return __kernel_standard(x,y,4,&err); /* hypot overflow */
} else
return z;
#endif
}

View File

@ -63,7 +63,8 @@
double z = __ieee754_j0(x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x)) return z;
if(fd_fabs(x)>X_TLOSS) {
return __kernel_standard(x,x,34); /* j0(|x|>X_TLOSS) */
int err;
return __kernel_standard(x,x,34,&err); /* j0(|x|>X_TLOSS) */
} else
return z;
#endif
@ -80,18 +81,19 @@
return __ieee754_y0(x);
#else
double z;
int err;
z = __ieee754_y0(x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x) ) return z;
if(x <= 0.0){
if(x==0.0)
/* d= -one/(x-x); */
return __kernel_standard(x,x,8);
return __kernel_standard(x,x,8,&err);
else
/* d = zero/(x-x); */
return __kernel_standard(x,x,9);
return __kernel_standard(x,x,9,&err);
}
if(x>X_TLOSS) {
return __kernel_standard(x,x,35); /* y0(x>X_TLOSS) */
return __kernel_standard(x,x,35,&err); /* y0(x>X_TLOSS) */
} else
return z;
#endif

View File

@ -64,7 +64,8 @@
z = __ieee754_j1(x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x) ) return z;
if(fd_fabs(x)>X_TLOSS) {
return __kernel_standard(x,x,36); /* j1(|x|>X_TLOSS) */
int err;
return __kernel_standard(x,x,36,&err); /* j1(|x|>X_TLOSS) */
} else
return z;
#endif
@ -81,18 +82,19 @@
return __ieee754_y1(x);
#else
double z;
int err;
z = __ieee754_y1(x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x) ) return z;
if(x <= 0.0){
if(x==0.0)
/* d= -one/(x-x); */
return __kernel_standard(x,x,10);
return __kernel_standard(x,x,10,&err);
else
/* d = zero/(x-x); */
return __kernel_standard(x,x,11);
return __kernel_standard(x,x,11,&err);
}
if(x>X_TLOSS) {
return __kernel_standard(x,x,37); /* y1(x>X_TLOSS) */
return __kernel_standard(x,x,37,&err); /* y1(x>X_TLOSS) */
} else
return z;
#endif

View File

@ -86,7 +86,8 @@
z = __ieee754_jn(n,x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x) ) return z;
if(fd_fabs(x)>X_TLOSS) {
return __kernel_standard((double)n,x,38); /* jn(|x|>X_TLOSS,n) */
int err;
return __kernel_standard((double)n,x,38,&err); /* jn(|x|>X_TLOSS,n) */
} else
return z;
#endif
@ -103,18 +104,19 @@
return __ieee754_yn(n,x);
#else
double z;
int err;
z = __ieee754_yn(n,x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x) ) return z;
if(x <= 0.0){
if(x==0.0)
/* d= -one/(x-x); */
return __kernel_standard((double)n,x,12);
return __kernel_standard((double)n,x,12,&err);
else
/* d = zero/(x-x); */
return __kernel_standard((double)n,x,13);
return __kernel_standard((double)n,x,13,&err);
}
if(x>X_TLOSS) {
return __kernel_standard((double)n,x,39); /* yn(x>X_TLOSS,n) */
return __kernel_standard((double)n,x,39,&err); /* yn(x>X_TLOSS,n) */
} else
return z;
#endif

View File

@ -69,10 +69,11 @@ extern int signgam;
y = __ieee754_lgamma_r(x,&signgam);
if(_LIB_VERSION == _IEEE_) return y;
if(!fd_finite(y)&&fd_finite(x)) {
int err;
if(fd_floor(x)==x&&x<=0.0)
return __kernel_standard(x,x,15); /* lgamma pole */
return __kernel_standard(x,x,15,&err); /* lgamma pole */
else
return __kernel_standard(x,x,14); /* lgamma overflow */
return __kernel_standard(x,x,14,&err); /* lgamma overflow */
} else
return y;
#endif

View File

@ -65,10 +65,11 @@
y = __ieee754_lgamma_r(x,signgamp);
if(_LIB_VERSION == _IEEE_) return y;
if(!fd_finite(y)&&fd_finite(x)) {
int err;
if(fd_floor(x)==x&&x<=0.0)
return __kernel_standard(x,x,15); /* lgamma pole */
return __kernel_standard(x,x,15,&err); /* lgamma pole */
else
return __kernel_standard(x,x,14); /* lgamma overflow */
return __kernel_standard(x,x,14,&err); /* lgamma overflow */
} else
return y;
#endif

View File

@ -62,11 +62,12 @@
return __ieee754_log(x);
#else
double z;
int err;
z = __ieee754_log(x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x) || x > 0.0) return z;
if(x==0.0)
return __kernel_standard(x,x,16); /* log(0) */
return __kernel_standard(x,x,16,&err); /* log(0) */
else
return __kernel_standard(x,x,17); /* log(x<0) */
return __kernel_standard(x,x,17,&err); /* log(x<0) */
#endif
}

View File

@ -65,10 +65,11 @@
z = __ieee754_log10(x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x)) return z;
if(x<=0.0) {
int err;
if(x==0.0)
return __kernel_standard(x,x,18); /* log10(0) */
return __kernel_standard(x,x,18,&err); /* log10(0) */
else
return __kernel_standard(x,x,19); /* log10(x<0) */
return __kernel_standard(x,x,19,&err); /* log10(x<0) */
} else
return z;
#endif

View File

@ -63,31 +63,32 @@
return __ieee754_pow(x,y);
#else
double z;
int err;
z=__ieee754_pow(x,y);
if(_LIB_VERSION == _IEEE_|| fd_isnan(y)) return z;
if(fd_isnan(x)) {
if(y==0.0)
return __kernel_standard(x,y,42); /* pow(NaN,0.0) */
return __kernel_standard(x,y,42,&err); /* pow(NaN,0.0) */
else
return z;
}
if(x==0.0){
if(y==0.0)
return __kernel_standard(x,y,20); /* pow(0.0,0.0) */
return __kernel_standard(x,y,20,&err); /* pow(0.0,0.0) */
if(fd_finite(y)&&y<0.0)
return __kernel_standard(x,y,23); /* pow(0.0,negative) */
return __kernel_standard(x,y,23,&err); /* pow(0.0,negative) */
return z;
}
if(!fd_finite(z)) {
if(fd_finite(x)&&fd_finite(y)) {
if(fd_isnan(z))
return __kernel_standard(x,y,24); /* pow neg**non-int */
return __kernel_standard(x,y,24,&err); /* pow neg**non-int */
else
return __kernel_standard(x,y,21); /* pow overflow */
return __kernel_standard(x,y,21,&err); /* pow overflow */
}
}
if(z==0.0&&fd_finite(x)&&fd_finite(y))
return __kernel_standard(x,y,22); /* pow underflow */
return __kernel_standard(x,y,22,&err); /* pow underflow */
return z;
#endif
}

View File

@ -63,9 +63,10 @@
double z;
z = __ieee754_remainder(x,y);
if(_LIB_VERSION == _IEEE_ || fd_isnan(y)) return z;
if(y==0.0)
return __kernel_standard(x,y,28); /* remainder(x,0) */
else
if(y==0.0) {
int err;
return __kernel_standard(x,y,28,&err); /* remainder(x,0) */
} else
return z;
#endif
}

View File

@ -73,13 +73,14 @@
return __ieee754_scalb(x,fn);
#else
double z;
int err;
z = __ieee754_scalb(x,fn);
if(_LIB_VERSION == _IEEE_) return z;
if(!(fd_finite(z)||fd_isnan(z))&&fd_finite(x)) {
return __kernel_standard(x,(double)fn,32); /* scalb overflow */
return __kernel_standard(x,(double)fn,32,&err); /* scalb overflow */
}
if(z==0.0&&z!=x) {
return __kernel_standard(x,(double)fn,33); /* scalb underflow */
return __kernel_standard(x,(double)fn,33,&err); /* scalb underflow */
}
#ifndef _SCALB_INT
if(!fd_finite(fn)) errno = ERANGE;

View File

@ -64,7 +64,8 @@
z = __ieee754_sinh(x);
if(_LIB_VERSION == _IEEE_) return z;
if(!fd_finite(z)&&fd_finite(x)) {
return __kernel_standard(x,x,25); /* sinh overflow */
int err;
return __kernel_standard(x,x,25,&err); /* sinh overflow */
} else
return z;
#endif

View File

@ -64,7 +64,8 @@
z = __ieee754_sqrt(x);
if(_LIB_VERSION == _IEEE_ || fd_isnan(x)) return z;
if(x<0.0) {
return __kernel_standard(x,x,26); /* sqrt(negative) */
int err;
return __kernel_standard(x,x,26,&err); /* sqrt(negative) */
} else
return z;
#endif

View File

@ -88,7 +88,7 @@
/* strtod for IEEE-arithmetic machines.
*
* This strtod returns a nearest machine number to the input decimal
* string (or sets errno to ERANGE). With IEEE arithmetic, ties are
* string (or sets err to ERANGE). With IEEE arithmetic, ties are
* broken by the IEEE round-even rule. Otherwise ties are broken by
* biased rounding (add half and chop).
*
@ -1087,7 +1087,7 @@ void js_FinishDtoa(void)
/* nspr2 watcom bug ifdef omitted */
JS_FRIEND_API(double)
JS_strtod(CONST char *s00, char **se)
JS_strtod(CONST char *s00, char **se, int *err)
{
int32 scale;
int32 bb2, bb5, bbe, bd2, bd5, bbbits, bs2, c, dsign,
@ -1102,6 +1102,8 @@ JS_strtod(CONST char *s00, char **se)
if (!initialized) InitDtoa();
#endif
*err = 0;
bb = bd = bs = delta = NULL;
sign = nz0 = nz = 0;
rv = 0.;
@ -1293,7 +1295,7 @@ dig_done:
if (e1 &= ~15) {
if (e1 > DBL_MAX_10_EXP) {
ovfl:
errno = ERANGE;
*err = ERANGE;
#ifdef __STDC__
rv = HUGE_VAL;
#else
@ -1364,7 +1366,7 @@ dig_done:
if (!rv) {
undfl:
rv = 0.;
errno = ERANGE;
*err = ERANGE;
if (bd0)
goto retfree;
goto ret;

View File

@ -54,7 +54,7 @@ JS_BEGIN_EXTERN_C
* zero is returned.
*/
JS_FRIEND_API(double)
JS_strtod(const char *s00, char **se);
JS_strtod(const char *s00, char **se, int *err);
/*
* Modes for converting floating-point numbers to strings.

View File

@ -611,7 +611,6 @@ js_ValueToNumber(JSContext *cx, jsval v, jsdouble *dp)
*dp = *JSVAL_TO_DOUBLE(v);
} else if (JSVAL_IS_STRING(v)) {
str = JSVAL_TO_STRING(v);
errno = 0;
/*
* Note that ECMA doesn't treat a string beginning with a '0' as an
* octal number here. This works because all such numbers will be
@ -801,9 +800,9 @@ js_strtod(JSContext *cx, const jschar *s, const jschar **ep, jsdouble *dp)
d = *(negative ? cx->runtime->jsNegativeInfinity : cx->runtime->jsPositiveInfinity);
estr = istr + 8;
} else {
errno = 0;
d = JS_strtod(cstr, &estr);
if (errno == ERANGE) {
int err;
d = JS_strtod(cstr, &estr, &err);
if (err == ERANGE) {
if (d == HUGE_VAL)
d = *cx->runtime->jsPositiveInfinity;
else if (d == -HUGE_VAL)
@ -924,6 +923,7 @@ js_strtointeger(JSContext *cx, const jschar *s, const jschar **ep, jsint base, j
size_t length = s1 - start;
char *cstr = (char *) malloc(length + 1);
char *estr;
int err=0;
if (!cstr)
return JS_FALSE;
@ -931,9 +931,8 @@ js_strtointeger(JSContext *cx, const jschar *s, const jschar **ep, jsint base, j
cstr[i] = (char)start[i];
cstr[length] = 0;
errno = 0;
value = JS_strtod(cstr, &estr);
if (errno == ERANGE && value == HUGE_VAL)
value = JS_strtod(cstr, &estr, &err);
if (err == ERANGE && value == HUGE_VAL)
value = *cx->runtime->jsPositiveInfinity;
free(cstr);
} else if ((base & (base - 1)) == 0) {

View File

@ -260,7 +260,7 @@ js_NewFileTokenStream(JSContext *cx, const char *filename, FILE *defaultfp)
file = fopen(filename, "r");
if (!file) {
JS_ReportErrorNumber(cx, js_GetErrorMessage, NULL, JSMSG_CANT_OPEN,
filename, strerror(errno));
filename, "No such file or directory");
return NULL;
}
}