From 6e2c5ce9d2220c2be7d35a0be15e9e6827305476 Mon Sep 17 00:00:00 2001 From: Eric Blake Date: Tue, 11 Dec 2007 14:00:26 -0700 Subject: [PATCH] Fix bug with -0.0L in previous patch. * lib/isnan.c (rpl_isnanl): Make robust to -0.0L and pad bits. * tests/test-isnan.c (main): Also test on zeroes. * tests/test-isnanf.c (main): Likewise. * tests/test-isnanl.h (main): Likewise. Signed-off-by: Eric Blake --- ChangeLog | 6 ++++++ lib/isnan.c | 4 +++- tests/test-isnan.c | 2 ++ tests/test-isnanf.c | 2 ++ tests/test-isnanl.h | 2 ++ 5 files changed, 15 insertions(+), 1 deletion(-) diff --git a/ChangeLog b/ChangeLog index 127f9a546..a954c4cbd 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,11 @@ 2007-12-11 Eric Blake + Fix bug with -0.0L in previous patch. + * lib/isnan.c (rpl_isnanl): Make robust to -0.0L and pad bits. + * tests/test-isnan.c (main): Also test on zeroes. + * tests/test-isnanf.c (main): Likewise. + * tests/test-isnanl.h (main): Likewise. + Detect pseudo-denormals on x86 even when cross-compiling. * lib/isnan.c (rpl_isnanl) [!KNOWN_EXPBIT0_LOCATION && USE_LONG_DOUBLE && x86]: Add one more check to filter out diff --git a/lib/isnan.c b/lib/isnan.c index 182a7bd5f..04bf7f0d9 100644 --- a/lib/isnan.c +++ b/lib/isnan.c @@ -146,8 +146,10 @@ FUNC (DOUBLE x) memory_double m1; memory_double m2; + memset (&m1.value, 0, SIZE); + memset (&m2.value, 0, SIZE); m1.value = x; - m2.value = x + 0; + m2.value = x + (x ? 0.0L : -0.0L); if (memcmp (&m1.value, &m2.value, SIZE) != 0) return 1; # endif diff --git a/tests/test-isnan.c b/tests/test-isnan.c index 717ad7a9c..3541af4be 100644 --- a/tests/test-isnan.c +++ b/tests/test-isnan.c @@ -57,6 +57,8 @@ main () ASSERT (!isnan (-2.718)); ASSERT (!isnan (-2.718e30)); ASSERT (!isnan (-2.718e-30)); + ASSERT (!isnan (0.0)); + ASSERT (!isnan (-0.0)); /* Infinite values. */ ASSERT (!isnan (1.0 / 0.0)); ASSERT (!isnan (-1.0 / 0.0)); diff --git a/tests/test-isnanf.c b/tests/test-isnanf.c index 898e6edff..c43308990 100644 --- a/tests/test-isnanf.c +++ b/tests/test-isnanf.c @@ -57,6 +57,8 @@ main () ASSERT (!isnanf (-2.718f)); ASSERT (!isnanf (-2.718e30f)); ASSERT (!isnanf (-2.718e-30f)); + ASSERT (!isnanf (0.0f)); + ASSERT (!isnanf (-0.0f)); /* Infinite values. */ ASSERT (!isnanf (1.0f / 0.0f)); ASSERT (!isnanf (-1.0f / 0.0f)); diff --git a/tests/test-isnanl.h b/tests/test-isnanl.h index 588545705..657948c94 100644 --- a/tests/test-isnanl.h +++ b/tests/test-isnanl.h @@ -47,6 +47,8 @@ main () ASSERT (!isnanl (-2.718L)); ASSERT (!isnanl (-2.718e30L)); ASSERT (!isnanl (-2.718e-30L)); + ASSERT (!isnanl (0.0L)); + ASSERT (!isnanl (-0.0L)); /* Infinite values. */ ASSERT (!isnanl (1.0L / 0.0L)); ASSERT (!isnanl (-1.0L / 0.0L)); -- 2.11.0