Subnormal numbers are the nonzero floating-point numbers between -FLT_MIN
and FLT_MIN
(for type float
) and -DBL_MIN
and DBL_MIN
(for type double
). The constant FLT_MIN
is typically 1.17549435E-38F
, that is, small. If you do only a little programming with floating-point numbers, you may never have encountered a subnormal number.
On a compilation platform with FLT_HAS_SUBNORM == 0
, there are only the numbers +0. and -0. between -FLT_MIN
and FLT_MIN
.
Subnormal numbers are usually handled in software (since they have exceptional behavior and do not happen often). One reason not to handle them at all is to avoid the slowdown that can occur when they happen. This can be important in real-time contexts.
The next Intel desktop processor generation (or is it the current one?) will handle subnormals in hardware.
The notion of subnormal number has nothing to do with the notations 33.3
and 333E-1
, which represent the same double
value.
The justification for subnormals and the history of their standardization in IEEE 754 can be found in these reminiscences by Kahan, under “Gradual Underflow”.
EDIT:
I could not find a source for Intel handling subnormals in hardware in its next generation of processors, but I found one for Nvidia's Fermi platform doing so already.