[BZ #15335, #15342] Fix standard compliance. Don't use hard-coded qNaN values.

This commit is contained in:
Thomas Schwinge 2013-04-03 22:00:21 +02:00
parent d91da4ce87
commit 8b43a0c9f2
4 changed files with 15 additions and 10 deletions

View File

@ -1,5 +1,10 @@
2013-04-05 Thomas Schwinge <thomas@codesourcery.com>
[BZ #15335, #15342]
* sysdeps/ieee754/dbl-64/upow.h (NaNQ): Remove definitions.
* sysdeps/ieee754/dbl-64/e_pow.c (__ieee754_pow): Instead, use
input NaN values or generate a qNaN by arithmetic operation.
* sysdeps/ieee754/dbl-64/e_pow.c (__ieee754_pow): Remove
unreachable code.

2
NEWS
View File

@ -13,7 +13,7 @@ Version 2.18
14317, 14327, 14478, 14496, 14812, 14920, 14964, 14981, 14982, 14985,
14994, 14996, 15003, 15006, 15020, 15023, 15036, 15054, 15055, 15062,
15078, 15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15305,
15307, 15327, 15330, 15337.
15307, 15327, 15330, 15335, 15337, 15342.
* CVE-2013-0242 Buffer overrun in regexp matcher has been fixed (Bugzilla
#15078).

View File

@ -71,8 +71,9 @@ __ieee754_pow(double x, double y) {
u.x=x;
if (v.i[LOW_HALF] == 0) { /* of y */
qx = u.i[HIGH_HALF]&0x7fffffff;
/* Checking if x is not too small to compute */
if (((qx==0x7ff00000)&&(u.i[LOW_HALF]!=0))||(qx>0x7ff00000)) return NaNQ.x;
/* Is x a NaN? */
if (((qx == 0x7ff00000) && (u.i[LOW_HALF] != 0)) || (qx > 0x7ff00000))
return x;
if (y == 1.0) return x;
if (y == 2.0) return x*x;
if (y == -1.0) return 1.0/x;
@ -111,7 +112,7 @@ __ieee754_pow(double x, double y) {
if (x == 0) {
if (((v.i[HIGH_HALF] & 0x7fffffff) == 0x7ff00000 && v.i[LOW_HALF] != 0)
|| (v.i[HIGH_HALF] & 0x7fffffff) > 0x7ff00000)
|| (v.i[HIGH_HALF] & 0x7fffffff) > 0x7ff00000) /* NaN */
return y;
if (ABS(y) > 1.0e20) return (y>0)?0:1.0/0.0;
k = checkint(y);
@ -124,9 +125,10 @@ __ieee754_pow(double x, double y) {
qx = u.i[HIGH_HALF]&0x7fffffff; /* no sign */
qy = v.i[HIGH_HALF]&0x7fffffff; /* no sign */
if (qx >= 0x7ff00000 && (qx > 0x7ff00000 || u.i[LOW_HALF] != 0)) return NaNQ.x;
if (qy >= 0x7ff00000 && (qy > 0x7ff00000 || v.i[LOW_HALF] != 0))
return x == 1.0 ? 1.0 : NaNQ.x;
if (qx >= 0x7ff00000 && (qx > 0x7ff00000 || u.i[LOW_HALF] != 0)) /* NaN */
return x;
if (qy >= 0x7ff00000 && (qy > 0x7ff00000 || v.i[LOW_HALF] != 0)) /* NaN */
return x == 1.0 ? 1.0 : y;
/* if x<0 */
if (u.i[HIGH_HALF] < 0) {
@ -139,7 +141,7 @@ __ieee754_pow(double x, double y) {
}
else if (qx == 0x7ff00000)
return y < 0 ? 0.0 : INF.x;
return NaNQ.x; /* y not integer and x<0 */
return (x - x) / (x - x); /* y not integer and x<0 */
}
else if (qx == 0x7ff00000)
{

View File

@ -34,7 +34,6 @@
/**/ nZERO = {{0x80000000, 0}}, /* -0.0 */
/**/ INF = {{0x7ff00000, 0x00000000}}, /* INF */
/**/ nINF = {{0xfff00000, 0x00000000}}, /* -INF */
/**/ NaNQ = {{0x7ff80000, 0x00000000}}, /* NaNQ */
/**/ sqrt_2 = {{0x3ff6a09e, 0x667f3bcc}}, /* sqrt(2) */
/**/ ln2a = {{0x3fe62e42, 0xfefa3800}}, /* ln(2) 43 bits */
/**/ ln2b = {{0x3d2ef357, 0x93c76730}}, /* ln(2)-ln2a */
@ -49,7 +48,6 @@
/**/ nZERO = {{0, 0x80000000}}, /* -0.0 */
/**/ INF = {{0x00000000, 0x7ff00000}}, /* INF */
/**/ nINF = {{0x00000000, 0xfff00000}}, /* -INF */
/**/ NaNQ = {{0x00000000, 0x7ff80000}}, /* NaNQ */
/**/ sqrt_2 = {{0x667f3bcc, 0x3ff6a09e}}, /* sqrt(2) */
/**/ ln2a = {{0xfefa3800, 0x3fe62e42}}, /* ln(2) 43 bits */
/**/ ln2b = {{0x93c76730, 0x3d2ef357}}, /* ln(2)-ln2a */