Numerical accuracy#
This document summarizes the accuracy of JAX mathematical functions.
Methodology and terminology#
Units in the Last Place (ULPs): Error is measured in ULPs relative to a higher-precision reference: for sub-64-bit types (
bfloat16,float16, andfloat32), reference values are evaluated in double precision (float64); forfloat64, reference values are evaluated usingmpmathwith 100-bit precision. A bound of \(0.5\) ULP is a correctly rounded result.Exhaustive vs. Sampled Testing:
For 16-bit types (
bfloat16,float16) and 32-bit types (float32), bounds are verified by exhaustive testing across all bit patterns.For
float64, bounds are estimated by random sampling across the floating-point domain. Because sampling cannot guarantee hitting the worst-case input, values in thefloat64table are empirical lower bounds on the true maximum error (denoted with \(\ge\)).
Flush-To-Zero (FTZ): Subnormal floating-point inputs and outputs are typically flushed to zero by default, though some operations on types smaller than
float32do not flush.Hardware Platforms:
CPU: x86_64.
NVIDIA GPU: H100 and B200.
TPU: TPU v2–v5e, TPU v5p, TPU v6e, and TPU 7x.
bfloat16 accuracy#
Maximum error in units in the last place (ULPs) for bfloat16:
Function |
CPU |
NVIDIA GPU |
TPU v2–v5e |
TPU v5p |
TPU v6e |
TPU 7x |
|---|---|---|---|---|---|---|
1.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
2.0 |
0.5 |
1.0 |
1.0 |
1.0 |
1.0 |
|
128.0 |
0.5 |
128.0 |
128.0 |
128.0 |
128.0 |
|
1.5 |
0.5 |
1.0 |
1.0 |
1.0 |
1.0 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
1.5 |
0.5 |
1.0 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
0.5 |
1.0 |
1.0 |
1.0 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
101.0 |
101.0 |
44.0 |
44.0 |
44.0 |
75.0 |
|
0.5 |
0.5 |
1.0 |
1.0 |
1.0 |
1.0 |
|
0.5 |
0.5 |
1.0 |
0.5 |
0.5 |
0.5 |
|
2.0 |
2.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
0.5 |
0.5 |
1.0 |
0.5 |
0.5 |
0.5 |
|
2.0 |
2.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
2.5 |
2.5 |
1.0 |
1.0 |
0.5 |
63.0 |
|
0.5 |
0.5 |
1.0 |
1.0 |
0.5 |
0.5 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
1.0 |
1.0 |
1.0 |
1.0 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
1.0 |
1.0 |
1.0 |
1.0 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
float16 accuracy#
Maximum error in units in the last place (ULPs) for float16:
Function |
CPU |
NVIDIA GPU |
TPU v2–v5e |
TPU v5p |
TPU v6e |
TPU 7x |
|---|---|---|---|---|---|---|
1.5 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
2.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
1.5 |
1.0 |
0.5 |
0.5 |
0.5 |
0.5 |
|
1.5 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
1.5 |
0.5 |
1.0 |
1.0 |
0.5 |
0.5 |
|
1.0 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
1.0 |
1.0 |
1.0 |
1.0 |
0.5 |
0.5 |
|
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
1.0 |
0.5 |
0.5 |
0.5 |
1.0 |
1.0 |
|
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
14.0 |
14.0 |
7.5 |
7.5 |
7.5 |
7.5 |
|
2.5 |
1.0 |
1.0 |
1.0 |
0.5 |
0.5 |
|
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
1.5 |
1.5 |
1.0 |
1.0 |
1.0 |
1.0 |
|
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
2.0 |
2.0 |
1.5 |
1.0 |
1.0 |
1.0 |
|
2.0 |
2.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
1.0 |
0.5 |
1.0 |
1.0 |
1.0 |
1.0 |
|
0.5 |
0.5 |
1.0 |
1.0 |
1.0 |
1.0 |
|
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
|
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
1.0 |
|
0.5 |
0.5 |
1.0 |
1.0 |
0.5 |
0.5 |
float32 accuracy#
Maximum error in units in the last place (ULPs) for float32:
Function |
CPU |
NVIDIA GPU |
TPU v2–v5e |
TPU v5p |
TPU v6e |
TPU 7x |
Notes |
|---|---|---|---|---|---|---|---|
1.5 |
1.5 |
5.0 |
5.0 |
4.0 |
5.0 |
||
4.5 |
2.5 |
4031.0 |
1003.0 |
984.0 |
984.0 |
||
8388608.0 |
1.5 |
8388607.0 |
8388607.0 |
8388607.0 |
8388607.0 |
||
3.5 |
2.0 |
4034.5 |
2082.5 |
2049.0 |
2049.0 |
||
4.0–5.5 |
1.5 |
2.5 |
2.5 |
2.5 |
2.5 |
CPU bound depends on AMD vs Intel |
|
3.0 |
3.5 |
2183.5 |
1061.5 |
1025.5 |
1025.5 |
||
7.0 |
8.0 |
8.0 |
8.0 |
8.0 |
8.0 |
||
11.0 |
15.5 |
15.5 |
15.5 |
15.5 |
15.5 |
||
0.5 |
1.5 |
4.5 |
4.5 |
1.5 |
1.5 |
||
0.5 |
2.0 |
3.5 |
3.5 |
3.5 |
3.0 |
||
25.0 |
2.5 |
93.5 |
99.0 |
59.0 |
59.5 |
||
7.0 |
6.5 |
7.5 |
8.5 |
1.5 |
1.5 |
||
65.0 |
65.0 |
427.0 |
65.5 |
65.0 |
65.5 |
||
66.0 |
66.5 |
145.0 |
157.0 |
124.5 |
125.0 |
||
1.5 |
2.0 |
116.0 |
109.5 |
64.5 |
65.0 |
||
|
1.5 |
2.0 |
1.5 |
1.5 |
1.5 |
1.5 |
|
68.5 |
69.0 |
141.5 |
133.0 |
90.0 |
90.0 |
||
6.5 |
1.5 |
1772.0 |
1357.5 |
64.0 |
63.5 |
||
1.5 |
1.0 |
4030.5 |
62.0 |
2.5 |
2.5 |
||
3.0 |
2.5 |
6213.0 |
57.0 |
3.0 |
3.0 |
||
3.0 |
1.0 |
4034.0 |
2082.5 |
2049.0 |
2049.0 |
||
2.5 |
2.0 |
5159.0 |
57.5 |
2.5 |
2.5 |
||
2.5 |
4.0 |
243.0 |
124.0 |
65.5 |
64.0 |
||
0.5 |
1.0 |
198.0 |
40.0 |
1.5 |
1.5 |
||
1.0–2.0 |
2.0 |
2.5 |
2.5 |
1.5 |
1.0 |
CPU bound depends on AMD vs Intel |
|
0.5 |
1.5 |
3.5 |
3.5 |
3.5 |
3.5 |
||
2.5 |
3.5 |
4.0 |
4.0 |
4.0 |
3.5 |
||
25.0 |
3.0 |
1794.0 |
1332.5 |
59.0 |
59.5 |
||
0.5 |
1.0 |
3.0 |
3.0 |
2.0 |
2.0 |
||
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
0.5 |
||
0.5 |
3.5 |
6.5 |
7.0 |
5.5 |
5.5 |
||
5.0 |
5.5 |
1365.5 |
92.0 |
1.5 |
1.5 |
float64 accuracy#
Maximum error in units in the last place (ULPs) for float64.
Note
TPUs have no true float64 hardware. While bounds for smaller types are exhaustive, for float64 these are lower bounds.
Function |
CPU |
NVIDIA GPU |
|---|---|---|
\(\ge 1.0\) |
\(\ge 1.5\) |
|
\(\ge 3.5\) |
\(\ge 2.5\) |
|
\(\ge 4503599627370496.0\) |
\(\ge 2.5\) |
|
\(\ge 2.0\) |
\(\ge 2.5\) |
|
\(\ge 3.5\) |
\(\ge 2.5\) |
|
\(\ge 2.5\) |
\(\ge 3.5\) |
|
\(\ge 7.5\) |
\(\ge 7.5\) |
|
\(\ge 10.5\) |
\(\ge 6.0\) |
|
\(\ge 0.5\) |
\(\ge 1.5\) |
|
\(\ge 0.5\) |
\(\ge 1.5\) |
|
\(\ge 496.0\) |
\(\ge 2.5\) |
|
\(\ge 2.5\) |
\(\ge 2.5\) |
|
\(\ge 82.5\) |
\(\ge 83.5\) |
|
\(\ge 350.0\) |
\(\ge 350.0\) |
|
\(\ge 1.0\) |
\(\ge 1.5\) |
|
\(\ge 719.0\) |
\(\ge 719.0\) |
|
\(\ge 4.5\) |
\(\ge 1.5\) |
|
\(\ge 0.5\) |
\(\ge 1.5\) |
|
\(\ge 2.0\) |
\(\ge 2.5\) |
|
\(\ge 2.0\) |
\(\ge 1.5\) |
|
\(\ge 1.5\) |
\(\ge 1.5\) |
|
\(\ge 3.5\) |
\(\ge 4.5\) |
|
\(\ge 0.5\) |
\(\ge 0.5\) |
|
\(\ge 1.5\) |
\(\ge 1.5\) |
|
\(\ge 0.5\) |
\(\ge 2.5\) |
|
\(\ge 2.0\) |
\(\ge 2.0\) |
|
\(\ge 496.0\) |
\(\ge 2.5\) |
|
\(\ge 0.5\) |
\(\ge 0.5\) |
|
\(\ge 0.5\) |
\(\ge 0.5\) |
|
\(\ge 0.5\) |
\(\ge 2.5\) |
|
\(\ge 6.5\) |
\(\ge 3.5\) |