From: Bruno Haible Date: Fri, 6 Apr 2007 21:22:02 +0000 (+0000) Subject: Faster determination of the sign of a number. X-Git-Tag: cvs-readonly~563 X-Git-Url: http://erislabs.org.uk/gitweb/?a=commitdiff_plain;h=7c21ed66f6a0713c10bbea14d7d47a9cc5ba9c55;p=gnulib.git Faster determination of the sign of a number. --- diff --git a/ChangeLog b/ChangeLog index 3421488bc..e3d77ac02 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,20 @@ 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. * tests/test-frexpl.c (main): Likewise. * tests/test-ldexpl.c (main): Likewise. diff --git a/lib/vasnprintf.c b/lib/vasnprintf.c index 06bf03421..62ad62be3 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 2be06d0a4..cf440592e 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 65edc647a..1ad3423ee 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 05d7d4f61..a9bb8eeee 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 d47b62e5e..5110362c4 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 0f2aeb727..d25e780fd 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 d9bdf6d40..815c483b0 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 ce4bde8f2..b189b07bc 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 cfb35a661..bc8614760 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 ef8b22c63..ff6251479 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: