From: Bruno Haible <bruno@clisp.org>
Date: Fri, 6 Apr 2007 21:22:02 +0000 (+0000)
Subject: Faster determination of the sign of a number.
X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=7c21ed66f6a0713c10bbea14d7d47a9cc5ba9c55;p=pspp

Faster determination of the sign of a number.
---

diff --git a/ChangeLog b/ChangeLog
index 3421488bc5..e3d77ac02e 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,18 @@
+2007-04-06  Bruno Haible  <bruno@clisp.org>
+
+	* lib/vasnprintf.c: Include <math.h>. Don't include float+.h.
+	(VASNPRINTF): Use signbit for faster determination whether to print a
+	minus sign.
+	* modules/vasnprintf (Files): Remove lib/float+.h.
+	* modules/fprintf-posix (Depends-on): Add signbit.
+	* modules/snprintf-posix (Depends-on): Likewise.
+	* modules/sprintf-posix (Depends-on): Likewise.
+	* modules/vasnprintf-posix (Depends-on): Likewise.
+	* modules/vasprintf-posix (Depends-on): Likewise.
+	* modules/vfprintf-posix (Depends-on): Likewise.
+	* modules/vsnprintf-posix (Depends-on): Likewise.
+	* modules/vsprintf-posix (Depends-on): Likewise.
+
 2007-04-06  Bruno Haible  <bruno@clisp.org>
 
 	* tests/test-frexp.c (main): Test also the sign bit of zero results.
diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c
index 06bf034210..62ad62be3f 100644
--- a/lib/vasnprintf.c
+++ b/lib/vasnprintf.c
@@ -54,7 +54,7 @@
 #include "xsize.h"
 
 #if NEED_PRINTF_DIRECTIVE_A && !defined IN_LIBINTL
-# include "float+.h"
+# include <math.h>
 # include "isnan.h"
 # include "printf-frexp.h"
 # include "isnanl-nolibm.h"
@@ -445,22 +445,11 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
 
 			BEGIN_LONG_DOUBLE_ROUNDING ();
 
-			if (arg < 0.0L)
+			if (signbit (arg)) /* arg < 0.0L or negative zero */
 			  {
 			    sign = -1;
 			    arg = -arg;
 			  }
-			else if (arg == 0.0L)
-			  {
-			    /* Distinguish 0.0L and -0.0L.  */
-			    static long double plus_zero = 0.0L;
-			    long double arg_mem = arg;
-			    if (memcmp (&plus_zero, &arg_mem, SIZEOF_LDBL) != 0)
-			      {
-				sign = -1;
-				arg = -arg;
-			      }
-			  }
 
 			if (sign < 0)
 			  *p++ = '-';
@@ -590,22 +579,11 @@ VASNPRINTF (CHAR_T *resultbuf, size_t *lengthp, const CHAR_T *format, va_list ar
 		      {
 			int sign = 0;
 
-			if (arg < 0.0)
+			if (signbit (arg)) /* arg < 0.0 or negative zero */
 			  {
 			    sign = -1;
 			    arg = -arg;
 			  }
-			else if (arg == 0.0)
-			  {
-			    /* Distinguish 0.0 and -0.0.  */
-			    static double plus_zero = 0.0;
-			    double arg_mem = arg;
-			    if (memcmp (&plus_zero, &arg_mem, SIZEOF_DBL) != 0)
-			      {
-				sign = -1;
-				arg = -arg;
-			      }
-			  }
 
 			if (sign < 0)
 			  *p++ = '-';
diff --git a/modules/fprintf-posix b/modules/fprintf-posix
index 2be06d0a48..cf440592ea 100644
--- a/modules/fprintf-posix
+++ b/modules/fprintf-posix
@@ -14,6 +14,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
diff --git a/modules/snprintf-posix b/modules/snprintf-posix
index 65edc647ad..1ad3423ee0 100644
--- a/modules/snprintf-posix
+++ b/modules/snprintf-posix
@@ -13,6 +13,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
diff --git a/modules/sprintf-posix b/modules/sprintf-posix
index 05d7d4f613..a9bb8eeee1 100644
--- a/modules/sprintf-posix
+++ b/modules/sprintf-posix
@@ -13,6 +13,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
diff --git a/modules/vasnprintf b/modules/vasnprintf
index d47b62e5eb..5110362c45 100644
--- a/modules/vasnprintf
+++ b/modules/vasnprintf
@@ -6,7 +6,6 @@ lib/printf-args.h
 lib/printf-args.c
 lib/printf-parse.h
 lib/printf-parse.c
-lib/float+.h
 lib/vasnprintf.h
 lib/vasnprintf.c
 lib/asnprintf.c
diff --git a/modules/vasnprintf-posix b/modules/vasnprintf-posix
index 0f2aeb7277..d25e780fdc 100644
--- a/modules/vasnprintf-posix
+++ b/modules/vasnprintf-posix
@@ -12,6 +12,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
diff --git a/modules/vasprintf-posix b/modules/vasprintf-posix
index d9bdf6d402..815c483b0f 100644
--- a/modules/vasprintf-posix
+++ b/modules/vasprintf-posix
@@ -12,6 +12,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
diff --git a/modules/vfprintf-posix b/modules/vfprintf-posix
index ce4bde8f23..b189b07bc2 100644
--- a/modules/vfprintf-posix
+++ b/modules/vfprintf-posix
@@ -14,6 +14,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
diff --git a/modules/vsnprintf-posix b/modules/vsnprintf-posix
index cfb35a6611..bc8614760b 100644
--- a/modules/vsnprintf-posix
+++ b/modules/vsnprintf-posix
@@ -13,6 +13,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
diff --git a/modules/vsprintf-posix b/modules/vsprintf-posix
index ef8b22c637..ff62514799 100644
--- a/modules/vsprintf-posix
+++ b/modules/vsprintf-posix
@@ -13,6 +13,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac: