On the night of 25 February 1991, an Iraqi Scud missile arced toward an American barracks in Dhahran, Saudi Arabia. A Patriot battery was on watch, its radar sweeping the sky, its software ready to compute an intercept. It never fired. The Scud struck the barracks and killed twenty-eight soldiers. The missile that failed was not out of fuel or out of range. It was defeated by a number a binary computer cannot hold: one tenth.
A computer stores numbers in a finite string of bits, so it can represent only finitely many of the infinitely many reals. The representable values form a grid, and any number falling between two grid points must be nudged to the nearest one — or, worse, simply chopped down. Most of the time the nudge is invisibly small. But 0.1, so innocent in decimal, is an infinitely repeating fraction in binary — 0.0001100110011… — and no finite register can hold it exactly. Every computer that ever printed 0.1 was rounding.
"The catastrophe was not one large error. It was one tiny error — the missing tail of 0.1 — added to itself three and a half million times." — after the U.S. GAO report, IMTEC-92-26
I · The Grid Between the RealsWhy one tenth is unrepresentable
The Patriot kept time by counting tenths of a second in an integer register, incremented ten times a second by the system clock. To turn that count into seconds for its targeting equations it multiplied by its stored value of 0.1. That value lived in a 24-bit register, which held 0.1 chopped to twenty-three binary places — the value 0.00011001100110011001100, short of the truth by about 0.000000095 of a second. One tick, the error is nothing. But the battery in Dhahran had been running continuously for roughly a hundred hours, and the counter had ticked about three and a half million times. The errors did not cancel; the chop always fell the same way, so they accumulated, and the system's clock had drifted about a third of a second behind reality.
A third of a second is nothing to a person and everything to an anti-missile system. A Scud closes at roughly 1,676 metres per second, so a 0.34-second error placed the target more than half a kilometre from where the Patriot expected it — far outside the narrow "range gate" the radar searches to confirm a track. The system looked in the wrong patch of sky, found nothing, and stood down. Set the two dials below and watch the abyss open: too few bits, too many hours, and the interceptor misses. Add precision, and the universe is corrected.
The range gate forgives about one tenth of a second of timing uncertainty — roughly 167 m of Scud flight. It is a bitter irony that one tenth of a second is exactly the quantity the machine could not represent. When the accumulated drift exceeds that tolerance, the true target falls outside the gate and the intercept fails.
II · Small Errors, Faithfully RepeatedThe arithmetic of accumulation
The moral of Dhahran is not that computers are imprecise — a single rounding of 0.1 is smaller than a proton is to a person. The moral is that error has a direction and a memory. Because the Patriot always chopped 0.1 downward, every one of its three and a half million ticks erred the same way, and the mistakes marched in step instead of cancelling. This is the difference between rounding and chopping that Knuth dissects in §4.2.2: round-to-nearest, the IEEE default, scatters its errors in both directions so they tend to cancel; truncation biases them, and bias accumulates without bound. Flip the simulator from Chop to Round at the same 24 bits and watch the drift shrink — the same precision, spent more wisely.
Precision buys you time, not safety. Doubling the bits pushes the abyss further away; it does not fill it. Only reasoning about the error does that.
Knuth devotes the whole of §4.2 to this reasoning — how floating-point addition is not associative, how subtracting nearly equal numbers annihilates significant digits (catastrophic cancellation), how to bound the error of a computation before it runs. The engineers had, in fact, found the Patriot bug and shipped a fix; it reached Dhahran the day after the strike. In the interim the field advice was brutally simple and exactly right: reboot the system often, so the counter never has time to drift. It is the oldest workaround in computing, and it was a confession that nobody had reasoned about the error in time.
III · Living at the EdgeThe abyss is always there
Every scientific simulation, every bank ledger, every physics engine and neural network runs at the lip of this abyss. The remedies are a craft of their own: Kahan summation, which recovers the lost low-order bits when adding a long series; arbitrary-precision and exact rational arithmetic, which refuse to round at all; interval arithmetic, which carries rigorous error bars through every operation; and above all William Kahan's IEEE-754 standard of 1985, which at least made the rounding predictable, identical on every conforming machine — the reason this very simulator gives you the same numbers it gives everyone else.
"An algorithm must be seen to be believed." — D. E. Knuth
The next room escapes the abyss entirely. Where floating point approximates the continuum and pays in accumulated error, modular and exact integer arithmetic work in a finite world where every operation is precise — the arithmetic of primes and cryptography, where a single wrong bit is not a drifting missile but a broken key. But the lesson of the Patriot travels with us: the machine will always tell you a number. Whether that number is true is a question only you can be trusted to ask.