No, all relevant C implementations must support a floating point value of 0.0 .
The floating point model is described in section 5.2.4.2.2 of standard C (reference refers to a recent project). This model does not make the leading 1 in the meaningful (sometimes called mantissa) implicit, so it has no problems representing 0.0 .
Most binary floating point implementations do not preserve the leading 1 , but in fact the formula that you indicated in the question:
x = (-1)^s * 2^e * 1.m
usually correct (although storage method e may vary).
In such implementations, including IEEE, a special bit-bit is used to represent 0.0 , which is typical for all bit-zero.
Following the discussion in the comments, tmyklebu argues that not all numbers defined by the floating point model in 5.2.4.2.2 must be represented. I disagree; if not all such numbers should be representable, then the model is almost useless. But even leaving this argument aside, there is an explicit requirement that 0.0 must be representable. N1570 6.7.9 clause 10:
If an object that has a static or storage duration of threads is not explicitly initialized, then:
- ...
- if it has an arithmetic type, it is initialized to zero (positive or unsigned);
- ...
This is a very old requirement. A reference C of 1975 (3 years before the publication of K & R1):
The initial value of any external object that is not explicitly initialized is guaranteed to be 0.
which means that there must be a representable value of 0. K & R1 (published in 1978) says, on page 198:
Static and external variables that are not initialized are guaranteed to start at 0; automatic and register variables that are not initialized are guaranteed to start as garbage.
It is interesting to note that the 1990 ISO C standard (equivalent to the 1989 ANSI C standard) is somewhat less explicit than its predecessors and successors. 6.5.7 states:
If an object that has a static storage duration is not initialized explicitly, it is initialized implicitly, as if each member that has an arithmetic type was assigned 0, and each member having a pointer type was assigned a null pointer constant.
If a floating point type is not required for an exact representation for 0.0 , then the phrase "assigned 0" will mean the conversion from int 0 to a floating point type, giving a small value close to 0.0 . However, the C90 has the same floating point model as C99 and C11 (but without mentioning subnormal or abnormal values), and my argument above about model numbers is still applicable. In addition, the C90 standard was officially replaced by the C99, which in turn was replaced by the C11.