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 3421488..e3d77ac 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,5 +1,20 @@
 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.
        * tests/test-frexpl.c (main): Likewise.
        * tests/test-ldexpl.c (main): Likewise.
index 06bf034..62ad62b 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 2be06d0..cf44059 100644 (file)
@@ -14,6 +14,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index 65edc64..1ad3423 100644 (file)
@@ -13,6 +13,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index 05d7d4f..a9bb8ee 100644 (file)
@@ -13,6 +13,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index d47b62e..5110362 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 0f2aeb7..d25e780 100644 (file)
@@ -12,6 +12,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index d9bdf6d..815c483 100644 (file)
@@ -12,6 +12,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index ce4bde8..b189b07 100644 (file)
@@ -14,6 +14,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index cfb35a6..bc86147 100644 (file)
@@ -13,6 +13,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac:
index ef8b22c..ff62514 100644 (file)
@@ -13,6 +13,7 @@ isnan-nolibm
 isnanl-nolibm
 printf-frexp
 printf-frexpl
+signbit
 fpucw
 
 configure.ac: