Mathematical real numbers may be approximated by multiple floating-point representations. One representation is defined as
normal, and others are defined as
subnormal,
denormal, or
unnormal by their relationship to
normal. In a
normal floating-point value, there are no
leading zeros in the
significand (also commonly called mantissa); rather, leading zeros are removed by adjusting the exponent (for example, the number 0.0123 would be written as ). Conversely, a denormalized floating-point value has a significand with a leading digit of zero. Of these, the subnormal numbers represent values which if normalized would have exponents below the smallest representable exponent (the exponent having a limited range). The significand (or mantissa) of an
IEEE floating-point number is the part of a floating-point number that represents the
significant digits. For a positive normalised number, it can be represented as
m0.
m1
m2
m3...
mp−2
mp−1 (where
m represents a significant digit, and
p is the precision) with non-zero
m0. Notice that for a binary
radix, the leading binary digit is always 1. In a subnormal number, since the exponent is the least that it can be, zero is the leading significant digit (0.
m1
m2
m3...
mp−2
mp−1), allowing the representation of numbers closer to zero than the smallest normal number. A floating-point number may be recognized as subnormal whenever its exponent has the least possible value. By filling the underflow gap like this, significant digits are lost, but not as abruptly as when using the
flush to zero on underflow approach (discarding all significant digits when underflow is reached). Hence the production of a subnormal number is sometimes called
gradual underflow because it allows a calculation to lose precision slowly when the result is small. In
IEEE 754-2008, subnormal numbers are supported in both binary and decimal formats. In binary interchange formats, subnormal numbers are encoded with a
biased exponent of 0, but are interpreted with the value of the smallest allowed exponent, which is one greater (i.e., as if it were encoded as a 1). In decimal interchange formats they require no special encoding because the format supports unnormalized numbers directly. Mathematically speaking, the normalized floating-point numbers of a given
sign are roughly
logarithmically spaced, and as such any finite-sized normal float
cannot include zero. The subnormal floats are a linearly spaced set of values, which span the gap between the negative and positive normal floats. == Background ==