Every low-precision format is a bet on how many bits go to exponent (dynamic range) versus mantissa (precision).

Anatomy

A float is . With exponent bits and mantissa bits:

The table

FormatBits (S/E/M)Max finiteSmallest normalRel. precision Where used
FP321/8/233.4e381.2e−386.0e−8accumulators, master weights, norms
TF321/8/103.4e381.2e−384.9e−4tensor-core FP32 fallback
FP161/5/10655046.1e−54.9e−4legacy inference; needs loss scaling in training
BF161/8/73.4e381.2e−383.9e−3default training + inference activation dtype
FP8 E4M31/4/34481.6e−26.3e−2weights & activations (precision-leaning)
FP8 E5M21/5/2573446.1e−51.3e−1gradients (range-leaning)
FP6 E3M21/3/2280.251.3e−1weight-only, block-scaled
FP4 E2M11/2/160.52.5e−1block-scaled weights/activations
INT88 (int)127, (step )classic PTQ, per-channel scales
INT44 (int)7, (step )weight-only, group size 32–128

FP4 E2M1 representable magnitudes: , 8 positive values. It is unusable without a per-block scale.

The range-vs-precision choice

  • BF16 replaced FP16 in training because gradients span ~ to : FP16’s 5 exponent bits underflow, forcing loss scaling; BF16 keeps FP32’s exponent and just throws away mantissa.
  • E4M3 for forward, E5M2 for backward for the same reason at 8 bits: activations are bounded and want precision, gradients are heavy-tailed and want range.
  • Below 8 bits neither is enough on its own, so the exponent moves outside the element into a shared block scale: see Microscaling Formats.

Rule of thumb

Exponent bits buy range, mantissa bits buy precision.