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.tar glibc-8b43a0c9f26d5cf067119e47df9973515535673f.tar.gz glibc-8b43a0c9f26d5cf067119e47df9973515535673f.tar.bz2 glibc-8b43a0c9f26d5cf067119e47df9973515535673f.zip |
[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 44d6f62398..9a766e7224 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 67bae1aefc..130fb3296f 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 */ |