Conversely, a denormalized floating-point value has a significand with a leading digit of zero.
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.
When subnormal values are entirely computed in hardware, implementation techniques exist to allow their processing at speeds comparable to normal numbers.
[4] However, the speed of computation remains significantly reduced on many modern x86 processors; in extreme cases, instructions involving subnormal operands may take as many as 100 additional clock cycles, causing the fastest instructions to run as much as six times slower.
For instance, in audio processing applications, subnormal values usually represent a signal so quiet that it is out of the human hearing range.
[9] Since the SSE2 processor extension, Intel has provided such a functionality in CPU hardware, which rounds subnormal numbers to zero.
[10] Intel's C and Fortran compilers enable the DAZ (denormals-are-zero) and FTZ (flush-to-zero) flags for SSE by default for optimization levels higher than -O0.
clang and gcc have varying default states depending on platform and optimization level.
[12] For other x86-SSE platforms where the C library has not yet implemented this flag, the following may work:[13] The _MM_SET_DENORMALS_ZERO_MODE and _MM_SET_FLUSH_ZERO_MODE macros wrap a more readable interface for the code above.
[14] Most compilers will already provide the previous macro by default, otherwise the following code snippet can be used (the definition for FTZ is analogous): The default denormalization behavior is mandated by the ABI, and therefore well-behaved software should save and restore the denormalization mode before returning to the caller or calling code in other libraries.
AArch32 NEON (SIMD) FPU always uses a flush-to-zero mode[citation needed], which is the same as FTZ + DAZ.