From 7c21ed66f6a0713c10bbea14d7d47a9cc5ba9c55 Mon Sep 17 00:00:00 2001 From: Bruno Haible Date: Fri, 6 Apr 2007 21:22:02 +0000 Subject: [PATCH] Faster determination of the sign of a number. --- ChangeLog | 15 +++++++++++++++ lib/vasnprintf.c | 28 +++------------------------- modules/fprintf-posix | 1 + modules/snprintf-posix | 1 + modules/sprintf-posix | 1 + modules/vasnprintf | 1 - modules/vasnprintf-posix | 1 + modules/vasprintf-posix | 1 + modules/vfprintf-posix | 1 + modules/vsnprintf-posix | 1 + modules/vsprintf-posix | 1 + 11 files changed, 26 insertions(+), 26 deletions(-) diff --git a/ChangeLog b/ChangeLog index 3421488bc5..e3d77ac02e 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,18 @@ +2007-04-06 Bruno Haible + + * lib/vasnprintf.c: Include . 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 * 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 # 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: -- 2.30.2