On most platforms, negating a positive zero yields a negative zero. Not so on HP-UX/HPPA: This platform has distinct positive and negative zeroes, but negating a positive zero yields a positive zero (in 'long double' format).
Test program: ======================================================= #include <math.h> #include <stdio.h> #include <string.h> long double x = 1.0L; long double y = -0.0L; long double z = 0.0L; int different_from_plus_zero (long double arg) { return memcmp (&arg, &z, sizeof (z)) != 0; } int main() { printf ("%Lf\n", x / y); printf ("%d\n", x / y < 0); printf ("%d\n", signbit (x/y) != 0); printf ("%d\n", different_from_plus_zero (y)); #define x 1.0L #define y -0.0L printf ("%Lf\n", x / y); printf ("%d\n", x / y < 0); printf ("%d\n", signbit (x/y) != 0); printf ("%d\n", different_from_plus_zero (y)); #undef y #define y -z printf ("%Lf\n", x / y); printf ("%d\n", x / y < 0); printf ("%d\n", signbit (x/y) != 0); printf ("%d\n", different_from_plus_zero (y)); return 0; } ===================================================== When run on this platform, the result is: -inf 1 1 1 -inf 1 1 1 inf 0 0 0 This causes a test failure in test-signbit.c. Fixing it like this: 2008-04-13 Bruno Haible <[EMAIL PROTECTED]> Make test-signbit pass on HP-UX/hppa. * tests/test-signbit.c (minus_zerol): New variable. (test_signbitl): Use it. *** tests/test-signbit.c.orig 2008-04-13 21:15:19.000000000 +0200 --- tests/test-signbit.c 2008-04-13 21:14:54.000000000 +0200 *************** *** 39,44 **** --- 39,47 ---- float zerof = 0.0f; double zerod = 0.0; long double zerol = 0.0L; + /* We cannot use the expression '-zerol' here, because on HP-UX/hppa it + evaluates to 0.0L, not -0.0L. */ + long double minus_zerol = -0.0L; static void test_signbitf () *************** *** 140,146 **** ASSERT (signbit (-2.718e-30L)); /* Zeros. */ ASSERT (!signbit (0.0L)); ! if (1.0L / -zerol < 0) ASSERT (signbit (-0.0L)); else ASSERT (!signbit (-0.0L)); --- 143,149 ---- ASSERT (signbit (-2.718e-30L)); /* Zeros. */ ASSERT (!signbit (0.0L)); ! if (1.0L / minus_zerol < 0) ASSERT (signbit (-0.0L)); else ASSERT (!signbit (-0.0L));