From: Bruno Haible Date: Sun, 25 Mar 2007 01:06:39 +0000 (+0000) Subject: Correct bitwise comparison of 'long double' numbers. X-Git-Tag: cvs-readonly~690 X-Git-Url: http://erislabs.net/gitweb/?a=commitdiff_plain;h=2c3e2e59f1a17819392d8900513af0701dc62c01;p=gnulib.git Correct bitwise comparison of 'long double' numbers. --- diff --git a/ChangeLog b/ChangeLog index b7b3388a8..3409b07c7 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,19 @@ 2007-03-24 Bruno Haible + * lib/float+.h: New file. + * lib/isnan.c: Include float+.h. + (SIZE): New macro. + (FUNC): Compare only SIZE bytes of the value. + * lib/vasnprintf.c: Include float+.h. + (VASNPRINTF): When comparing agains +0.0L or +0.0, compare only + SIZEOF_LDBL or SIZEOF_DBL bytes. + * modules/isnan-nolibm (Files): Add lib/float+.h. + * modules/isnanl-nolibm (Files): Add lib/float+.h. + * modules/isnanl (Files): Add lib/float+.h. + * modules/vasnprintf (Files): Add lib/float+.h. + +2007-03-24 Bruno Haible + * lib/vasnprintf.c [!HAVE_LONG_DOUBLE]: Include printf-frexp.h. Don't include isnanl-nolibm.h. diff --git a/lib/isnan.c b/lib/isnan.c index beeb98a50..9b6ec87b4 100644 --- a/lib/isnan.c +++ b/lib/isnan.c @@ -22,6 +22,8 @@ #include #include +#include "float+.h" + #ifdef USE_LONG_DOUBLE # define FUNC rpl_isnanl # define DOUBLE long double @@ -32,6 +34,7 @@ # define EXPBIT0_WORD LDBL_EXPBIT0_WORD # define EXPBIT0_BIT LDBL_EXPBIT0_BIT # endif +# define SIZE SIZEOF_LDBL # define L_(literal) literal##L #else # define FUNC rpl_isnan @@ -43,6 +46,7 @@ # define EXPBIT0_WORD DBL_EXPBIT0_WORD # define EXPBIT0_BIT DBL_EXPBIT0_BIT # endif +# define SIZE SIZEOF_DBL # define L_(literal) literal #endif @@ -79,8 +83,8 @@ FUNC (DOUBLE x) if (((m.word[EXPBIT0_WORD] ^ nan.word[EXPBIT0_WORD]) & (EXP_MASK << EXPBIT0_BIT)) == 0) - return (memcmp (&m.value, &plus_inf, sizeof (DOUBLE)) != 0 - && memcmp (&m.value, &minus_inf, sizeof (DOUBLE)) != 0); + return (memcmp (&m.value, &plus_inf, SIZE) != 0 + && memcmp (&m.value, &minus_inf, SIZE) != 0); else return 0; } diff --git a/modules/isnan-nolibm b/modules/isnan-nolibm index e251cec99..43adb609f 100644 --- a/modules/isnan-nolibm +++ b/modules/isnan-nolibm @@ -4,6 +4,7 @@ isnan() function: test for NaN, without requiring libm. Files: lib/isnan.h lib/isnan.c +lib/float+.h m4/isnan.m4 Depends-on: diff --git a/modules/isnanl b/modules/isnanl index cc171171a..7e6055574 100644 --- a/modules/isnanl +++ b/modules/isnanl @@ -5,6 +5,7 @@ Files: lib/isnanl.h lib/isnanl.c lib/isnan.c +lib/float+.h m4/isnanl.m4 m4/longdouble.m4 diff --git a/modules/isnanl-nolibm b/modules/isnanl-nolibm index 5cdb2cb6b..d45825a0d 100644 --- a/modules/isnanl-nolibm +++ b/modules/isnanl-nolibm @@ -5,6 +5,7 @@ Files: lib/isnanl-nolibm.h lib/isnanl.c lib/isnan.c +lib/float+.h m4/isnanl.m4 m4/longdouble.m4