I will calculate what is computable
Analysis
I took a real-analysis course once and never saw what the completeness axioms bought. You can use perfectly ordinary logic to deduce that a series converges — bound the tail, watch it shrink, done. What I could never get sold on was the rest of it: the insistence that the real line is stuffed with numbers no procedure can ever reach. To me that always sounded like claiming to own a triangle that is not a triangle. This page is the argument I wish someone had made to me then: a limit is an algebraic identity plus exactly one non-algebraic axiom, and that axiom is optional. Decline it and you lose nothing you could ever have computed with.
None of what follows is a proof, and none of it is an attack on the real numbers — they're a consistent and useful universe, and the people who built them weren't confused. It's an opinion about which objects are worth spending a calculation on, written for a site about computing, where that question actually has teeth. Take it as one practitioner's working stance, not a verdict.
A limit is a fake singularity, removed by algebra
Start with the thing everyone's first calculus course calls a limit:
Substitute and you get , the dreaded indeterminate form. But for every , the algebraic identity lets you divide by 1 in the form :
The right side is perfectly well-defined at , where it equals 2. The was never a real obstruction — it was an artifact of not simplifying. The limit is literally substitution once the identity removes the apparent singularity. Multiply by 1, cancel, evaluate. That's the entire move.
Every limit you computed by hand was this move in disguise. Stuck with in ? Multiply by 1 in the conjugate form:
Stuck with in ? Use the defining series , factor out (divide by 1 in the form ): , which equals 1 at the origin. The trick is always the same: rewrite until the indeterminate form turns into something with a defined value at the limit point.
ε–δ is the audit trail, not the magic
The formalism that makes real analysis feel forbidding is just a way to state the algebraic bound auditably. "For every there is a such that implies " reads as a story about infinities, but it's a finite promise: hand me a target precision in the output, and I'll hand you back — by an explicit algebraic computation — how tight the input has to be. For , the alternating-series bound gives , so works. The is an algebraic function of . Nothing infinitary happens; the quantifiers are bookkeeping for the inequality.
Where algebra runs out:
There's exactly one place the pure symbol-pushing fails. Take . The binomial theorem (an algebraic identity) gives
Each term is (the product is at most 1), and converges faster than geometrically. So the sequence is monotone increasing and bounded above. But here algebra stops: does not simplify to any closed finite expression. You cannot cancel your way to the answer. To conclude the limit exists, you invoke the one non-algebraic ingredient — the completeness axiom: a monotone bounded sequence converges to some real number. You name it . That invocation is a single line. Everything else on the page is the binomial theorem and elementary inequalities.
So the structure of every limit is: (1) algebraic identity that resolves the indeterminate form, (2) an explicit bound stating how close you must be — this is — and, only when step 1 fails to give a closed form, (3) a one-line appeal to completeness for existence. Step 3 is the only non-finitist atom, and it's cleanly separable, not woven into the manipulation.
The real dividing line: does the sequence carry a brake?
Here's the distinction that matters, and it's not finite-versus-infinite. The Leibniz series for never halts either — it's an infinite sequence of partial sums, same as any other. Infinitude is not the issue. The issue is a stopping rule. Constructively, a real number isn't merely a Cauchy sequence; it's a Cauchy sequence with a modulus of convergence: a computable function that says "go to term and you are guaranteed within ." The modulus is the brake. It's what lets you actually stop and report a value.
- via Leibniz has a brake: . You always know when to stop. It denotes a number.
- A Specker sequence (below) has no brake, and provably no computable one. You can compute every term and never know when you're close.
Limits that carry their own brake
Three transcendentals, each computed to high precision with an explicit error bound — a brake you can read off. from its factorial series with a guaranteed tail bound; via the Bailey-Borwein-Plouffe formula, which extracts any single hexadecimal digit in memory without computing the preceding ones; via Apéry's exponentially-convergent series. "Transcendental" and "no closed form" never meant "uncomputable" — they are facts about the limit value's arithmetic, never about the reachability of the approximation.
# Three limits, each with a computable brake: a rule that
# tells you, for any target precision, exactly when to stop.
from fractions import Fraction
from math import comb
# --- e = Σ 1/k! with explicit tail bound ---------------------------------
def e_to(n_terms):
s, fact = Fraction(0), 1
for k in range(n_terms):
if k > 0: fact *= k
s += Fraction(1, fact)
tail = Fraction(2, fact) if n_terms > 0 else Fraction(1) # Σ_{k≥n} 1/k! ≤ 2/n!
return s, tail
print("e via Σ 1/k! (value, GUARANTEED error bound):")
for n in [5, 10, 15, 20]:
val, bound = e_to(n)
print(f" n={n:>2}: {float(val):.15f} |error| ≤ {float(bound):.2e}")
# --- π via BBP: extract any single hex digit in O(1) memory ----------------
def bbp_hex_digit(d):
def S(j):
s = 0.0
for k in range(d):
r = 8*k + j
s = (s + pow(16, d-1-k, r) / r) % 1.0
k = d
while True:
term = 16.0**(d-1-k) / (8*k + j)
if term < 1e-17: break
s += term; k += 1
return s % 1.0
x = (4*S(1) - 2*S(4) - S(5) - S(6)) % 1.0
return "0123456789ABCDEF"[int(x * 16)]
print("\nπ hex digits 1-12 via BBP:", "".join(bbp_hex_digit(d) for d in range(1, 13)))
# --- ζ(3) via Apéry --------------------------------------------------------
def zeta3_to(n):
s = sum(Fraction((-1)**(m-1), m**3 * comb(2*m, m)) for m in range(1, n+1))
return Fraction(5, 2) * s
print("\nζ(3) via Apéry:")
for n in [3, 6, 9, 12]:
print(f" n={n:>2}: {float(zeta3_to(n)):.15f}") e via Σ 1/k! (value, GUARANTEED error bound):
n= 5: 2.708333333333333 |error| ≤ 8.33e-02
n=10: 2.718281525573192 |error| ≤ 5.51e-06
n=15: 2.718281828458230 |error| ≤ 2.29e-11
n=20: 2.718281828459045 |error| ≤ 1.64e-17
π hex digits 1-12 via BBP: 243F6A8885A3
ζ(3) via Apéry:
n= 3: 1.202546296296296
n= 6: 1.202055099607183
n= 9: 1.202056914472725
n=12: 1.202056903068957 The error bound shrinks from to as you add terms — you always know how wrong you are. The BBP hex digits match exactly, computed one at a time. These are limits with brakes. Every transcendental anyone has ever needed is one of these.
The ghost: a sequence engineered to have no brake
Now the counterexample that supposedly shows finitism hits a wall. Enumerate Turing machines and define
Each is a computable rational. The sequence is monotone increasing and bounded above by . So classically it converges to some real — and is not computable, because reading its binary digits would decide the halting problem. The textbook calls this "a limit that exists but cannot be computed." Look closely at the word exists: that is the completeness axiom talking, and it is exactly the thing the finitist refuses to spot you for free. Calling a number begs the entire question.
Watch the ghost. We can't run real Turing-machine halting, so to even simulate the Specker sequence we have to hand ourselves a halting schedule — which is precisely the oracle the real construction needs. We had to summon the oracle just to draw the picture — which is exactly what the example is meant to show.
# The ghost. We cannot run real Turing-machine halting, so we hand ourselves
# a halting schedule halt[k] = the step at which machine k halts (None = never).
# That table IS the oracle the real construction needs — we had to summon it
# just to simulate the ghost. That is the whole point.
import random
rng = random.Random(7)
halt = {k: (rng.randint(1, 10**6) if rng.random() < 0.5 else None)
for k in range(1, 30)}
def specker(n): # s_n = Σ_{k≤n, machine k halted by step n} 2^(-k)
return sum(2.0**(-k) for k in range(1, 30)
if halt[k] is not None and halt[k] <= n)
print("Simulated Specker partial sums (NO computable brake exists):")
for n in [10, 100, 10**3, 10**4, 10**5, 10**6]:
print(f" s({n:>8}) = {specker(n):.10f}") Simulated Specker partial sums (NO computable brake exists):
s( 10) = 0.0000000000
s( 100) = 0.0000000000
s( 1000) = 0.0000000000
s( 10000) = 0.0000000000
s( 100000) = 0.2734375000
s( 1000000) = 0.9981654342
The sum sits at exactly through ten thousand terms — if
you stopped there you'd "conclude" the limit is zero — then jumps to
, then . A machine could halt at
and bump the sum again. You can never certify
you're done: there is no modulus. And the table
halt that made the simulation possible is uncomputable in
reality (it is the halting problem), so even this picture
cheated by assuming the oracle. The non-computability isn't a property
has — it's manufactured by a definition that implicitly quantifies over the halting set. Strip the oracle and there is no
number there. A triangle that is not a triangle.
The ghost confirms the thesis instead of refuting it
The completeness statement the Specker sequence attacks is the Monotone Convergence Theorem: "monotone + bounded convergent." Specker's 1949 theorem is precisely that this is constructively false: here is a computable, monotone, bounded sequence of rationals whose limit is not a computable real. So the Specker sequence is the canonical witness that the completeness step is the non-finitist step. Rather than being a counterexample to "a limit is algebra plus one axiom," it lines up with it — it isolates that single axiom doing all the work and producing nothing you could compute with.
The theorem behind the suspicion
The instinct that the uncomputability is always "snuck in" via the definition is not a vibe; it's a theorem. A real is computable exactly when there's a computable sequence of rationals with . If is uncomputable, no such sequence exists — by definition. So any finite description of that effectively pinned it down would itself be an algorithm generating those , making computable, a contradiction. Therefore every finite description of an uncomputable real must be non-effective: it has to quantify over something undecidable — a halting set, a choice function, an oracle. There is no oracle-free, finitely-stated description of an uncomputable number.
Specker's and Chaitin's aren't unlucky natural quantities that happened to turn out uncomputable. They are the only kind of thing an uncomputable real can be — gadgets whose entire content is "encode an undecidable problem." That's why they smell like cheating. In a precise sense, they have to.
It's an axiom, not a calculation
Here is the actual fault line, and it is not something either side can force by computing. The classical mathematician says: the real line is a completed totality, almost all of its points are uncomputable (the computable reals are countable, hence measure zero), and the Specker construction merely names one of them via a description we located through halting — "it was already there." The finitist says: "already there" is the metaphysics of completed infinity I don't grant meaning to; show me the modulus or it isn't a number. Neither side disagrees about any finite fact. They disagree about whether "exists, but no algorithm can ever reach it" is a sentence with content. That is a choice of logic — the law of excluded middle, the least-upper-bound axiom — not a theorem.
Declining the ghosts costs you nothing you could compute with
This is the part real analysis never told me, and it's the answer to "what did completeness buy?" Keep the constructive form of completeness — "every Cauchy-sequence-with-modulus converges" — which is basically definitional and perfectly valid. You can still build , , , every transcendental anyone has ever named, each with its explicit brake. You lose exactly one thing by dropping the classical form (least-upper-bound, monotone convergence): the ghosts — the Specker numbers, the s, the inaccessible measure-one bulk of the continuum you could never have computed with in the first place. A finitist gives up the inaccessible and keeps everything usable.
Why I care: a working empiricism
None of this is a foundational crusade. My interest is narrower and more practical: I write calculations to predict things, and a calculation only predicts if I can run it. That's the whole filter — a calculation justifies itself by producing a number I can hold up against the world.
It's why regularization doesn't trouble me even when it looks like sleight of hand. -regularization assigns the divergent sum the value , and that isn't a parlor trick because it predicts the measured Casimir force. Yukawa-regularizing the Coulomb potential gives , trusted because it predicts real scattering and binding energies. Neither is true because it's formally slick; each is trusted because the finite number it returns matches an observable. Regularize, compute, take the limit, keep the finite part, check it against an experiment — that last step is the one that licenses the rest.
The filter cuts both ways, and this is the part I want to be clear about: it points to the value of being able to prove things. You want to know your algorithm converges to what you think it does, and completeness-style theorems are what underwrite that. But it also demands something proof alone doesn't give you — the calculation has to be constructive, because a noncomputable number can never be the output of a prediction. You can't measure a quantity against reality if no procedure produces it. The geometric series I can watch converge on a screen, the partial sums visibly settling onto . The Specker number I can only describe.
Some limits sit in between, and those are the hard cases. Asymptotic expansions — WKB, perturbation theory, saddle-point methods — don't converge at all in the usual sense; you truncate at the optimal term and the error is bounded but never vanishes. That's exactly where the modulus-of-continuity bookkeeping is for: you need to know how good a truncation is, because the series will betray you if you take too many terms. But even there, the object is something I compute and bound. For essentially everything I'll actually calculate, the pathologies — the nowhere-continuous Dirichlet function, the noncomputable reals, the limits with no stopping rule — never show up. Maybe one day we'll find out the world runs on Dirichlet functions. For now I'd bet it doesn't.
An opinion, not a proof
I'm no professional mathematician, and I haven't made any of this rigorous. It isn't a theorem and isn't trying to be one — it's a statement about what kind of objects I'm willing to spend a calculation on. Reject it freely: the real numbers don't need my permission to exist, the constructive and classical camps are a real fork with serious people on both sides, and classical completeness buys genuine convenience — compactness arguments, existence theorems, proofs that don't drag a modulus around — even if it isn't extra computational power.
But on a site about computing, here's where I land. Are all limits just algebraic curiosities? For everything I can actually name — yes: algebra plus an explicit stopping rule, with as the audit trail. The one borrowed axiom, completeness, does a single job — turning "arbitrarily good approximation" into "there is a thing being approximated" — and I only ever need its constructive form, the one that comes with a brake. The ghosts that need the classical form aren't numbers I could compute with; they're descriptions pointing at oracles. So I'll make my peace with the continuum and still, in practice, do the only thing a machine can do.
I will calculate what is computable.
Related on this site
- Padé approximant — resummation of a series, the algebraic-rewrite move applied to divergent expansions.
- Three representations of 1/r — where a singular object is tamed by Yukawa regularization, another "regulate, compute, take the limit, keep the finite part" pattern.
- Borel-Padé resummation — assigning finite values to divergent series by an explicit construction with its own brake.
References
- Specker, E. (1949). Nicht konstruktiv beweisbare Sätze der Analysis. J. Symbolic Logic, 14(3), 145-158. (The non-computable monotone bounded sequence.)
- Bishop, E. & Bridges, D. (1985). Constructive Analysis. Springer. (Reals as Cauchy sequences with moduli; analysis without classical completeness.)
- Bailey, D., Borwein, P., Plouffe, S. (1997). On the rapid computation of various polylogarithmic constants. Math. Comp., 66(218), 903-913. (The BBP digit-extraction formula.)
- Weihrauch, K. (2000). Computable Analysis: An Introduction. Springer. (The Type-2 theory: a real is computable iff it has a computable fast-Cauchy representation.)
- Chaitin, G. (1975). A theory of program size formally identical to information theory. J. ACM, 22(3), 329-340. (Ω, the canonical definable-but-uncomputable real.)