This is the mail archive of the libc-alpha@sourceware.org mailing list for the glibc project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[BZ #15335] Don't use hard-coded qNaN values in sysdeps/ieee754/dbl-64/e_pow.c:__ieee754_pow


Hi!

On Wed, 03 Apr 2013 21:52:21 +0200, I wrote:
> 	* sysdeps/ieee754/dbl-64/e_pow.c (__ieee754_pow): Remove
> 	unreachable code.

On top of that, OK to commit?

	[BZ #15335]
	* 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.

diff --git NEWS NEWS
index 3bb5cb3..1697d4e 100644
--- NEWS
+++ NEWS
@@ -12,7 +12,7 @@ Version 2.18
   10357, 11120, 11561, 12723, 13550, 13889, 13951, 14142, 14176, 14200,
   14317, 14327, 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, 15307.
+  15160, 15214, 15232, 15234, 15283, 15285, 15287, 15304, 15307, 15335.
 
 * Add support for calling C++11 thread_local object destructors on thread
   and program exit.  This needs compiler support for offloading C++11
diff --git sysdeps/ieee754/dbl-64/e_pow.c sysdeps/ieee754/dbl-64/e_pow.c
index 44d6f62..9a766e7 100644
--- sysdeps/ieee754/dbl-64/e_pow.c
+++ 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 sysdeps/ieee754/dbl-64/upow.h sysdeps/ieee754/dbl-64/upow.h
index 67bae1a..130fb32 100644
--- sysdeps/ieee754/dbl-64/upow.h
+++ 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    */


GrÃÃe,
 Thomas

Attachment: pgpdqc2xIsGY_.pgp
Description: PGP signature


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]