Faster determination of the sign of a number.
authorBruno Haible <bruno@clisp.org>
Fri, 6 Apr 2007 21:22:02 +0000 (21:22 +0000)
committerBruno Haible <bruno@clisp.org>
Fri, 6 Apr 2007 21:22:02 +0000 (21:22 +0000)
ChangeLog
lib/vasnprintf.c
modules/fprintf-posix
modules/snprintf-posix
modules/sprintf-posix
modules/vasnprintf
modules/vasnprintf-posix
modules/vasprintf-posix
modules/vfprintf-posix
modules/vsnprintf-posix
modules/vsprintf-posix

index 3421488bc5894a6a46c872128fcd70cde3bc487a..e3d77ac02efbd7d6388320f74d93becea5f25c75 100644 (file)
--- 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.
index 06bf03421095f60a65c738c9d16242341f04fb55..62ad62be3f8a4645623dd1f8b910f0445d8f8c89 100644 (file)
@@ -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++ = '-';
index 2be06d0a48c5a11a3d385490abd421e4a0fdc3c7..cf440592ea6440f500f00ca10a24580648b45837 100644 (file)
@@ -14,6 +14,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index 65edc647adaff3029ab9485799f58b1f02f44e76..1ad3423ee02f6bd9b742c75b196bdda86d728e6c 100644 (file)
@@ -13,6 +13,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index 05d7d4f6139075720abf54e169f3a10fd9cbae58..a9bb8eeee175e3bb3809ce54644663e681a2b7f1 100644 (file)
@@ -13,6 +13,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index d47b62e5eb1662caca41aa773989496ae88825a3..5110362c4585f9ebf3f7b2d41906acfc17b4e834 100644 (file)
@@ -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
index 0f2aeb72775134fe4f6edc1db34a3f39e608f8aa..d25e780fdc711b7b6cbbcbe0b738ab079717b2bd 100644 (file)
@@ -12,6 +12,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index d9bdf6d402165ccced309e545d5dd411ed28bd47..815c483b0ffb4ed1343c3bee55a7d8c89b8c2fed 100644 (file)
@@ -12,6 +12,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index ce4bde8f233762c1e036d6eb34a509e2bc06c69a..b189b07bc2977346080c135e6dece7f7c81e51ce 100644 (file)
@@ -14,6 +14,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index cfb35a6611b2bc515c452057b00c2538a2c103fb..bc8614760b0b5e9ad0c507ce0e463b85ea2783b2 100644 (file)
@@ -13,6 +13,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index ef8b22c63719599abf2f0098969c7d9efeba2f80..ff6251479928690d31d37f7a190d7999e61bc9d5 100644 (file)
@@ -13,6 +13,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac: