diff options
author | Thomas Schwinge <thomas@codesourcery.com> | 2013-04-03 22:00:21 +0200 |
---|---|---|
committer | Thomas Schwinge <thomas@codesourcery.com> | 2013-04-05 22:27:29 +0200 |
commit | 8b43a0c9f26d5cf067119e47df9973515535673f (patch) | |
tree | ac5f037ec69e76cf2ced6c53bc66adf6b21f5724 | |
parent | d91da4ce87cd571650f680c0d48d8d3441ec7d2f (diff) | |
download | glibc-8b43a0c9f26d5cf067119e47df9973515535673f.zip glibc-8b43a0c9f26d5cf067119e47df9973515535673f.tar.gz glibc-8b43a0c9f26d5cf067119e47df9973515535673f.tar.bz2 |
[BZ #15335, #15342] Fix standard compliance. Don't use hard-coded qNaN values.
-rw-r--r-- | ChangeLog | 5 | ||||
-rw-r--r-- | NEWS | 2 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/e_pow.c | 16 | ||||
-rw-r--r-- | sysdeps/ieee754/dbl-64/upow.h | 2 |
4 files changed, 15 insertions, 10 deletions
@@ -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. @@ -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). diff --git a/sysdeps/ieee754/dbl-64/e_pow.c b/sysdeps/ieee754/dbl-64/e_pow.c index 44d6f62..9a766e7 100644 --- a/sysdeps/ieee754/dbl-64/e_pow.c +++ b/sysdeps/ieee754/dbl-64/e_pow.c @@ -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) { diff --git a/sysdeps/ieee754/dbl-64/upow.h b/sysdeps/ieee754/dbl-64/upow.h index 67bae1a..130fb32 100644 --- a/sysdeps/ieee754/dbl-64/upow.h +++ b/sysdeps/ieee754/dbl-64/upow.h @@ -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 */ |