Document: WG14 N1677

Possible defect report: Is 0.0 required to be a representable value?

Submitter: Fred J. Tydeman (USA)
Submission Date: 2013-03-07
Subject:Possible defect report: Is 0.0 required to be a representable value?

There are many places in C11 that assume a floating-point zero value, e.g., 0.0, is representable.

There are many places in C11 that allow for a representable floating-point zero value.

The C Rationale in its discussion of has:

Note that the floating-point model adopted permits all common representations, including sign-magnitude and two's-complement, but precludes a logarithmic implementation.

The C89 Committee also endeavored to accommodate the IEEE 754 floating-point standard by not adopting any constraints on floating-point which were contrary to that standard.

However, if one carefully reads Characteristics of floating types <float.h>, #2 and #3, one finds that zero is not required to be representable. As I read those paragraphs, normalized floating-point numbers are the only things required to be contained in floating types. Subnormal floating-point numbers, unnormalized floating-point numbers, infinities, and NaNs are additional (optional) things that may be contained in floating types. Zero is not mentioned explicitly.

So, it appears that some parts of C11 require that floating-point zeros be representable, while other parts do not require that they be representable.

I think that the first sentance in #3 should be changed to:

Floating types shall be able to represent normalized floating-point numbers (f1 > 0 if x != 0) and (positive or unsigned) zero. In addition, floating types may be able to contain other kinds of floating-point numbers, such as negative zero and subnormal ...