Why does signbit(-0) return 0?

c, floating-point, sign

Solution

In `signbit(-0)`:

- `0` is a constant of type `int`.

- `-0` is the result of negating `0`, so it is zero of type `int`.

- This value is converted to floating-point.

- The sign bit in the floating-point value is zero, so `signbit(-0)` produces 0.

If you do `signbit(-0.)` instead:

- `0.` is a constant of type `double`.

- `-0.` is the result of negating `0.`, so it is a negative zero of type `double`.

- The sign bit in the floating-point value is one, so `signbit(-0.)` produces 1.

The key is that `-0` negates an integer type, and the integer types typically do not encode negative zero as distinct from a positive zero. When an integer zero is converted to floating point, the result is a simple (positive) zero. However, `-0.` negates a floating-point type, and the floating-point types do encode negative zero distinctly from positive zero.

Problem

From The Open Group Base Specifications Issue 7, IEEE Std 1003.1-2008: The signbit() macro shall return a non-zero value if and only if the sign of its argument value is negative. Why does `signbit(-0)` return `0`? I just want to understand the logic behind this decision.

Original source