A fixture that locates a part within ±0.1 mm. The parts were 0.3 mm off. I ran the tolerance stackup. The design had four dimensions in the chain, each with ±0.1 mm tolerance. Worst case: 4 × 0.1 = 0.4 mm. That’s exactly what we were seeing. The design assumed the tolerances would “average out.” They don’t. This is how I do tolerance stackup now.
The two methods
Worst-case stackup: add all the tolerances linearly. If you have four dimensions at ±0.1 mm, the total variation is ±0.4 mm. Every part, every time. This is conservative — it assumes every dimension is at its worst simultaneously. That’s rare, but it does happen (especially with a single supplier who holds the mean, not the extremes).
RSS (root sum square): combine the tolerances statistically. Total = sqrt(Σt²) = sqrt(4 × 0.1²) = sqrt(0.04) = 0.2 mm. This assumes the dimensions are normally distributed and independent. It’s the statistical 3-sigma range — 99.7% of parts fall within it. It’s realistic for production quantities, but 0.3% of parts will be outside.
When to use which
| Method | Use for | Conservatism |
|---|---|---|
| Worst-case (linear) | Critical fits, safety, small batch (1-100 parts) | Very conservative |
| RSS (statistical) | Production (1000+ parts), cosmetic fits, non-critical | Realistic but leaves 0.3% out |
| RSS with Cp correction | Production, process capability known | Most realistic |
For the fixture, I used worst-case. The parts were 50 per batch. Worst-case stackup gave 0.4 mm. The design tolerance was 0.1 mm. The stackup failed. I had two choices: tighten individual tolerances (expensive) or break the chain (add a shim, a locating feature, or a two-piece design).
The actual stackup
The chain was: base plate flatness (0.05) + fixture plate thickness (0.1) + part height (0.1) + locator height (0.05) = 0.3 mm worst case. I changed the design: instead of stacking four dimensions, I made the fixture plate register directly to the base plate with two dowel pins. The chain dropped from four links to two: locator height (0.05) + part height (0.1) = 0.15 mm worst case. That’s within the 0.1 mm target? No, it’s 0.15. But with RSS, it’s sqrt(0.05² + 0.1²) = 0.11 mm. Close enough. I also specified the locator as a ground surface (0.02) instead of a machined surface (0.05). Worst case: 0.02 + 0.1 = 0.12 mm. RSS: 0.10 mm. Now it meets spec.
The chain break
The best way to solve a tolerance stackup isn’t to tighten every tolerance (which costs money) — it’s to break the chain. If you can design so the critical dimension is between two features that are on the same part (same setup, same datum), the tolerance chain has fewer links. A single part machined in one setup has one tolerance between features. An assembly of three parts has three tolerances. I always look for ways to make the critical fit on one part, not across an assembly.
The datum reference
The stackup starts with a datum. If your datums are wrong, the stackup is meaningless. I use the same datums on the drawing as on the CMM inspection. If the drawing says “dimension from datum A” but the CMM measures from a different face, the numbers don’t match. I check the datum scheme first — before I run the stackup.
The number I check: worst-case stackup across all links in the critical dimension chain. If it exceeds the tolerance, I either tighten the critical link (not all links) or break the chain by redesigning. RSS is fine for production, but for low-volume fixtures I use worst-case. The fixture that was 0.3 mm off had four tolerances stacked linearly and nobody had run the numbers.