Prefer to click through the interactive model?
Limits — study guide
The same fragments the interactive model serves, read in order. One source, two views.
What a limit means
A limit answers one narrow question: as the input x slides closer and closer to some target value a, without ever needing to land on it, what number does f(x) slide closer and closer to? That destination number, when one exists, is the limit of f at a.
The notation writes it as lim(x -> a) f(x) = L: the limit of f(x), as x approaches a, equals L. The definition only cares about what f does for inputs near a but not equal to a — never about f(a) itself. That is deliberate: a limit can exist at a point where the function is not even defined, and it can exist at a value the function never actually takes there. The rest of this concept makes that gap concrete.
The model on this page walks an input toward a seam in a piecewise function and reports what each side is heading toward. Watching the two approach directions agree or disagree is the fastest way to feel what "the limit exists" really means before the definition gets more formal.
Approaching a value, numerically
One honest way to guess a limit is to build a small table. Take f(x) = x + 1 and ask what happens as x creeps toward 0 from below: at x = -0.1, f(x) = 0.9; at x = -0.01, f(x) = 0.99; at x = -0.001, f(x) = 0.999. The outputs are not jumping around — they are closing in on 1, and they keep closing in no matter how many more decimal places you add.
That closing-in is the whole idea, like watching a plane's altitude reading close in on the runway's elevation as it descends -- the number keeps getting closer, whether or not the plane ever actually touches down. However close you want f(x) to sit to 1, there is some distance from 0 close enough to guarantee it — a promise that has nothing to do with whether x ever actually reaches 0. Approaching from the other side works the same way: the inputs never touch the target, and the outputs never have to touch the limit either.
A table like this only suggests a limit; it cannot prove one, because no table has infinitely many rows, and a pattern that looks settled for ten rows can still misbehave at the eleventh. What a table is good for is intuition — seeing the number the outputs are aiming at before the concept's other tools pin it down exactly.
One-sided limits
Sometimes the question is not what f(x) approaches overall, but what it approaches from one direction only. The left-hand limit, written lim(x -> a^-) f(x), only considers inputs less than a, sliding in from below. The right-hand limit, lim(x -> a^+) f(x), only considers inputs greater than a, sliding in from above. Either one can exist by itself, independent of the other.
The two-sided limit lim(x -> a) f(x) exists, and equals some value L, exactly when both one-sided limits exist and both equal that same L — like two hikers walking toward the same mountain hut from opposite sides of the ridge -- the hut only counts as reached if both trails actually arrive at the same door. If the two directions are heading toward different numbers, or if one of them refuses to settle on any number at all, the two-sided limit does not exist, full stop — there is no averaging or compromise between disagreeing sides.
The model on this page makes the two directions literal: dragging the input toward a seam from below shows one piece's rule firing and its value closing in, and dragging it in from above shows the other piece doing the same. Watching where each approach is headed, before ever landing exactly on the seam, is one-sided limits in motion.
When a limit does not exist
A limit can fail to exist for a few genuinely different reasons, and it helps to keep them apart rather than lump them under one vague verdict.
The most common reason is disagreement: the one-sided limits exist but point at different numbers. Take f(x) = x + 1 for x < 0 and f(x) = x^2 for x >= 0. The left-hand limit at 0 is 1, the right-hand limit at 0 is 0, and 1 is not 0 — so lim(x -> 0) f(x) does not exist, even though f(0) is perfectly well defined and equals 0. A function being defined at a point guarantees nothing about whether its limit exists there.
A limit can also fail to exist because the outputs never settle at all. If f(x) grows without any ceiling as x approaches a point, there is no finite number to call the limit — a case worked out fully once asymptotes are on the table. A stranger failure is oscillation: f(x) = sin(1/x) swings back and forth between -1 and 1 infinitely many times as x approaches 0, crossing every value in between over and over, so it never closes in on any single number either.
The limit vs. the function's value
lim(x -> a) f(x) and f(a) are two separate questions, and it is easy to assume they must share an answer because for most everyday functions they do. The limit asks what f is heading toward near a; f(a) asks what f actually outputs when you plug a in. Nothing in the definition of a limit forces those two answers to match.
When they diverge, the point is called a removable discontinuity, a "hole" in the graph. The classic example is f(x) = (x^2 - 1) / (x - 1). Factor the top: (x - 1)(x + 1) / (x - 1), which is just x + 1 for every x except 1, where the original expression is 0 over 0 and undefined. So lim(x -> 1) f(x) = 2, a perfectly good limit, while f(1) does not exist at all — the graph is the line x + 1 with a single point missing exactly where the limit lives.
The model's boundary dots draw a related distinction: at a seam, the filled dot marks the value the piece that owns that input actually produces, and the open dot marks a value the other piece only approaches but never claims. Every input in the model's presets lands in some piece's domain, so nothing there goes fully undefined the way the hole example does — but the underlying lesson is the same one: the number a graph is heading toward and the number a function actually returns are not obligated to be the same number.
Limit laws and direct substitution
Once you know the limits of two simpler pieces, the limit of a combination built from them follows by ordinary algebra, not by starting the approach argument over from scratch. If lim(x -> a) f(x) = L and lim(x -> a) g(x) = M, then the limit of the sum is L + M, the difference is L - M, a constant multiple c times f has limit c times L, the product has limit L times M, and — provided M is not 0 — the quotient has limit L / M.
Polynomials are built from nothing but sums, constant multiples, and whole-number powers of x, so applying these laws to a polynomial over and over collapses lim(x -> a) p(x) all the way down to p(a). That is the real justification for direct substitution: plugging a straight into a polynomial is not a shortcut you are trusting blindly, it is what the limit laws prove will always give the correct answer.
The same substitution carries over to a quotient of two polynomials, at any input where the bottom polynomial's own value is not 0 — exactly the condition the quotient law already demands. Where the bottom does hit 0, direct substitution stops working, and that is precisely where the more interesting limits — the removable holes and the unbounded blowups — tend to live.
Unbounded behavior and asymptotes
Every limit so far has settled on a finite number, but a limit is also allowed to report that no finite number will do — that f(x) climbs past every bound you name as x approaches some target, like a speedometer needle pinned against the top of its dial, still trying to climb even though there is no higher number left to show. Writing lim(x -> a) f(x) = infinity does not mean the limit equals some number called infinity; it means the ordinary definition fails in a specific, describable way — the outputs outrun every ceiling instead of closing in on one.
When that unbounded climb happens right at a particular input a — from one side, from both sides, or both sides shooting off in opposite directions — the vertical line x = a is called a vertical asymptote of f. The graph never actually reaches that line; it runs alongside it, getting closer and closer while shooting up or down without limit, which is exactly why the word "asymptote" describes the line rather than any point on the curve.
A different kind of unboundedness happens on the input side instead. Asking what f(x) approaches as x itself runs off toward positive infinity, or toward negative infinity, is still a limit question, just not one anchored to a finite target a. When that limit settles on a finite value L, the horizontal line y = L is a horizontal asymptote — the graph flattens out and hugs that height the farther out you look, even though it may never touch it.
Why limits matter
Limits look like a technicality bolted onto algebra, but they are the reason calculus can make its central claims rigorously instead of hand-wavingly. Ideas like "the exact rate something is changing at a single instant" or "the exact area under a curve" sound intuitive, but turning them into claims you can actually prove requires being precise about what "getting arbitrarily close" means — which is exactly what a limit pins down.
Two of calculus's foundational questions — how fast something is changing at a single instant, and how much accumulates under a curve — both turn out, later, to be limit questions wearing different clothes. Neither one gets built here; both quietly depend on everything this concept just established.
That dependency is why limits sit underneath so much of what comes later, from a self-driving vehicle's control loop reacting smoothly to a changing road, to a learning system finding its way toward a better set of numbers. None of it works without knowing, precisely, what "getting arbitrarily close" is allowed to mean.