Version 3 • Rendering Mathematics

Perturbation Rendering

How the Mandelbrot Metal 3 Infinity Engine uses a single CPU double-double reference orbit One orbit computed in double-double arithmetic for a chosen reference point in the image. plus millions of Metal “delta orbits” to evaluate deep zooms through the app’s validated 1025× scale ceiling.

TL;DR

A direct deep renderer evaluates a multi-limb orbit for every pixel, which is robust but expensive. Perturbation changes the coordinate system: Mandelbrot Metal 3 computes one accurate reference orbit for a central parameter c0, then expresses nearby pixels as zn = Zn + δn. Metal evaluates the delta orbit in a fast Float tier and restarts difficult pixels in quad-single arithmetic. The full quadratic term is retained; Taylor truncation is explanatory mathematics here, not the Version 3 production recurrence.

Version 3 Scope

The Infinity Engine is Metal-first, not Metal-only. Its reference orbit is computed on the CPU; per-pixel perturbation and recovery run on the GPU; the established CPU deep renderer remains an automatic fallback. Version 3 uses adaptive finite precision and has a validated public viewport ceiling of 1 × 1025. It does not claim arbitrary precision, and useful resolved detail remains scene-dependent.

Glossary

Orbit

The sequence of iterates produced by repeatedly applying the Mandelbrot update rule. For a given parameter c, start at z0=0 and compute z1, z2, z3, … where zn+1=zn2+c. Escape tests, smooth coloring, and many “deep zoom” details come from how this orbit behaves as n grows.

Perturbation

Approximating the behavior of a system for a nearby parameter (or starting point) by writing it as a small correction to a known “reference” solution.

Reference point

A central parameter c0 in the image for which Mandelbrot Metal computes a double-double orbit Z0, Z1, Z2, ….

Reference orbit

The orbit of z0 = 0 under zn+1 = zn2 + c0, computed in CPU double-double arithmetic: Zn+1 = Zn2 + c0.

Perturbation (delta) orbit

For a nearby parameter c = c0 + Δc, we write zn = Zn + δn and evolve the small correction δn. Version 3 retains the complete quadratic recurrence.

Δc (delta-c)

The offset from the reference parameter: Δc = c − c0. For pixels in the same deep zoom tile, Δc is tiny.

Bailout radius

A radius R (e.g. R = 2 or larger) such that if |zn| > R, we declare the orbit “escaped” and stop iterating.

Taylor series

A way to approximate a smooth (analytic) function near a point by a power series. For a function f(x) near x0: f(x0 + h) = f(x0) + a1h + a2h2 + a3h3 + …. In perturbation rendering, the “small step” is h = Δc.

Series approximation

A separate acceleration family that approximates δn with a truncated power series in Δc. It is useful background here, but is not the Version 3.0 production pixel recurrence.

Error control

Monitoring growth and numerical conditioning, restarting difficult pixels in quad-single arithmetic, rebasing when appropriate, and rejecting an unusable Metal result rather than presenting it.

Double-double (DD)

A normalized sum of two IEEE 754 doubles. The CPU reference path provides about 106 significant binary bits in normal finite operation.

Quad-single (QS)

An unevaluated expansion of four Float limbs. The Infinity Engine uses QS for difficult GPU pixels and recovery work.

Adaptive finite precision

A fixed, bounded precision ladder chosen according to the work. It is materially different from an arbitrary-precision library whose mantissa can grow without a product-defined limit.

See It First

Deep zoom tile Full orbit per pixel
Fig. 1 — Direct deep rendering: every pixel runs its own multi-limb orbit. Robust, but expensive.
c₀ Reference orbit Zₙ Nearby c = c₀ + Δc Reuse Zₙ, update δₙ
Fig. 2 — Perturbation: compute one orbit Zn at c0, then update small deltas δn for nearby pixels.
error threshold rebase iterations n → |δₙ|
Fig. 3 — As δn grows, finite-precision conditioning can deteriorate. Version 3 can rebase its GPU state, restart the pixel in quad-single, or reject the Metal result.

Why Direct Deep Zoom Is So Expensive

The basic Mandelbrot iteration is simple: zn+1 = zn2 + c, with z0 = 0. At modest zoom levels, ordinary fixed-width arithmetic and a few hundred iterations per pixel are often enough.

But ultra-deep zooms are a different universe:

  • Pixel-to-pixel coordinate differences become extremely small and sensitive to rounding errors.
  • Orbits may require tens of thousands of iterations to resolve fine structure.
  • Extended finite-precision arithmetic beyond one 64-bit value becomes necessary.

If we run that extended-precision pipeline independently for every pixel, the cost grows rapidly. Each pixel re-discovers essentially the same orbit structure with slightly different parameters.

Perturbation rendering observes that in a deep zoom, pixels in a small tile are clustered tightly around a common parameter c0. That redundancy is exactly what perturbation exploits.

The Basic Perturbation Idea (and Where Taylor Series Enters)

Pick a reference parameter c0 near the view center and compute one orbit in CPU double-double arithmetic. For any pixel in the same frame, c is extremely close to c0, so we can represent the pixel as a small change Δc = c − c0.

1) Compute the reference orbit once

Z0 = 0
Zn+1 = Zn2 + c0

2) Express each pixel as “reference + correction”

For the pixel parameter c = c0 + Δc, the true orbit is:

z0 = 0
zn+1 = zn2 + c

Write zn = Zn + δn. Substituting:

zn+1 = (Zn + δn)2 + (c0 + Δc)

Expand and use Zn+1 = Zn2 + c0:

δ0 = 0
δn+1 = 2 Zn δn + δn2 + Δc

This recurrence is the workhorse form of perturbation. In exact arithmetic it follows algebraically from the original Mandelbrot recurrence—nothing has been approximated or dropped. The numerical approximation in an implementation comes from finite representations of Zn, δn, and their operations.

3) The Taylor-series view: a local sensitivity model

For a fixed iteration index n, the value zn(c) varies smoothly with c in a neighborhood around c0. That means you can view zn(c0 + Δc) as a Taylor series in the small number Δc:

zn(c0 + Δc) = zn(c0) + a1,n Δc + a2,n (Δc)2 + a3,n (Δc)3 + …

Because zn(c0) = Zn, the perturbation is exactly the “tail” of that series:

δn = zn(c0 + Δc) − Zn = a1,n Δc + a2,n (Δc)2 + a3,n (Δc)3 + …

When Δc is small and the coefficient growth is controlled, higher powers can initially shrink rapidly. That observation motivates Taylor and series-approximation accelerators. It does not mean that truncation is automatically safe near every boundary point or for every iteration count.

4) A useful analytical coefficient (first order)

A common “Taylor-first” approximation keeps only the first-order term a1,n Δc, where a1,n is the sensitivity of the orbit to changes in c at c0. It advances alongside the reference orbit via:

a1,0 = 0
a1,n+1 = 2 Zn a1,n + 1

Then the first-order perturbation estimate is:

δn ≈ a1,n Δc

Implementation note: this derivative recurrence explains local sensitivity and is relevant to future series accelerators. The Version 3.0 Infinity Engine does not replace the production pixel recurrence with this first-order truncation; it retains δn2.

5) Reconstruct the orbit for escape and coloring

For escape tests and smooth coloring formulas, the renderer reconstructs the represented orbit via zn = Zn + δn and applies the same bailout rule used by a direct per-pixel orbit. Equality is algebraic; the stored values remain finite-precision approximations.

Exact Recurrence vs. Taylor Truncation

When δn is very small, the quadratic term δn2 may be much smaller than 2 Zn δn. A first-order analysis can therefore drop it and study the linearized recurrence:

δn+1 ≈ 2 Zn δn + Δc

Series renderers can precompute higher-order coefficients or blocks of linearized work, trading more setup and storage for fewer operations per pixel. Their validity depends on explicit error bounds and reference selection.

  • More terms → better accuracy over more iterations, but more work per step.
  • Fewer terms → faster per step, but you must re-sync sooner.

Mandelbrot Metal 3.0 takes the conservative production path: every Infinity Engine pixel retains the full nonlinear term. Its speed comes from reference reuse, the Metal execution model, and a fast-to-quad-single precision ladder—not from discarding δn2.

When Does Perturbation Break Down?

The full recurrence is algebraically exact, but a finite-precision evaluation can become unreliable when cancellation, dynamic range, or perturbation growth overwhelms the active representation. In practice, several things can cause trouble:

  • Very long orbits at extreme zoom levels.
  • Points near sensitive structures (e.g., close to the boundary of 𝓜).
  • Parameters far enough from the reference that Δc or the evolving delta becomes poorly conditioned.

A robust perturbation renderer therefore:

  • Monitors delta growth, non-finite values, and glitch indicators.
  • Restarts difficult pixels from iteration zero in the quad-single path instead of continuing contaminated fast-path state.
  • Can rebase the GPU perturbation state to the represented current orbit without implying a new CPU reference orbit in the middle of that pixel.
  • Rejects an unusable Metal completion and hands the request to the established CPU deep renderer.

A committed viewport change may also trigger construction of a fresh CPU reference orbit for the new center. That is distinct from an in-kernel rebase during one pixel’s recurrence.

Three precision contracts

The saved center, CPU reference orbit, and GPU pixel recurrence do not all use the same representation. Canonical coordinates use fixed-capacity storage with 1,152 fractional bits. The public reference is calculated in double-double, then uploaded as four Float limbs per complex component. Metal evaluates nearby pixels with a Float fast tier and quad-single recovery.

More storage bits cannot repair a reference that has already lost information. Nor does a tiny, nonzero step guarantee that adding it to an absolute center will preserve it. Reference-relative mapping keeps the small difference separate for as long as possible.

What triggers recovery

The fast tier detects non-finite values, excessive delta growth, severe cancellation, and ambiguous escapes before accepting a color. It uses a conservative squared-magnitude ratio of 0.0625 for growth routing. The QS rebase policy uses a wider ratio of 0.25 and its own glitch checks. These are implementation thresholds, not mathematical error bounds.

A fast-tier rejection restarts the pixel in QS. A QS rebase resets the reference index without rebuilding the CPU orbit. If the reference is exhausted or invalid, direct QS recovery reconstructs the parameter from its anchor and offsets. If the complete Metal command is unusable, the frame can take the CPU deep fallback.

The split pixel steps must be finite and at least normal Float magnitude on both axes. Julia does not use the public Infinity path, and its current Metal parameter precision is a separate limitation. The release ceiling remains 1025 navigation points per complex-plane unit.

A small worked example

At reference parameter zero, the reference orbit remains zero. A neighboring sample with parameter 0.01 has first orbit value 0.01 and second value 0.0101. The second perturbation step includes both the squared offset, 0.0001, and the parameter offset, 0.01. Dropping the quadratic term would produce 0.01 instead. This illustrates the algebraic role of the term; it is not a test of deep precision.

Putting It Together: A Simplified Workflow

  1. Pick a reference parameter c0 near the center of the current view.
  2. Compute Zn once on the CPU in double-double arithmetic and upload each complex component as four Float limbs.
  3. For each pixel, form Δc = c − c0 and evolve the complete perturbation recurrence in Metal.
  4. Use the fast Float tier for well-conditioned pixels; restart difficult pixels in quad-single and apply rebase or direct recovery as needed.
  5. Reconstruct zn = Zn + δn for bailout, smooth coloring, and optional 3D Look data.
  6. Dispatch live deep work as bounded center-out Metal tiles over an initialized retained preview. Present completed tiles progressively and report completion only after the entire requested frame is rendered and presented. Fall back automatically if the Metal result is unusable.

Why This Matters in Mandelbrot Metal

Perturbation is the central change that moves repeated deep work from a per-pixel CPU path into a Metal-first pipeline while preserving the quadratic map:

  • Reference reuse — One double-double orbit supplies shared structure to millions of pixel threads.
  • Adaptive GPU precision — Well-conditioned pixels use a fast path; difficult pixels receive quad-single recovery rather than forcing every pixel through the most expensive representation.
  • Recovery policy — Restart, rebase, recovery, finite-value checks, and command validation address known failure modes. These checks reduce risk; they are not a proof that every finite-precision pixel is correct.
  • Continuous interaction — During a gesture the retained complete image follows the pan or pinch. After commit, completed center-out regions progressively replace the initialized preview; completion is reported after the full current frame reaches presentation.

This architecture is still finite and bounded. Version 3.0 deliberately stops at 1025× while later releases investigate more accurate reference coordinates and stronger series accelerators.

Where You’ll See This in Mandelbrot Metal

Perturbation is not exposed as a user toggle. The Infinity Engine activates automatically when the viewport becomes eligible for deep rendering; the HUD identifies the active quality path as Infinity.

  • Full-frame progress
    For deep work, the progress indicator reports the percentage of the requested frame completed—not an internal row count.
  • Pan, pinch, and double-tap
    The last complete image moves immediately with the gesture while the engine builds the newly requested fractal behind it.
  • Smooth coloring and 3D Look
    Both consume the reconstructed orbit data from the same completed render. 3D Look is shading over a two-dimensional escape field, not a different fractal equation.
  • Existing bookmarks
    Legacy bookmark coordinates and visual settings are restored through the same Version 3 viewport and rendering path, subject to the Version 3 scale policy.
  • Automatic fallback
    If the Infinity Engine is ineligible, a Metal command fails, or completion validation rejects the result, the established CPU deep renderer takes over without treating a partial image as finished.

Free and Pro use the same numerical engine and have the same zoom fidelity. Pro unlocks the broader creative and workflow feature set; it does not buy a more accurate Mandelbrot calculation.

Render Pipeline: From Full Orbits to Perturbation

Per-pixel CPU multi-limb orbit Coloring & shading Final image Established CPU fallback CPU DD ref Zₙ four Float limbs Metal δₙ + δₙ² Float / quad-single Color + shading from Zₙ + δₙ Infinity Engine v1
Fig. 4 — The established fallback runs a multi-limb CPU orbit per pixel. Version 3 computes one CPU double-double reference orbit and lets Metal evolve the complete perturbation recurrence per pixel before coloring and full-frame presentation.

Performance at a Glance

Aspect Established CPU Fallback Infinity Engine v1
Extended-precision work Multi-limb orbit evaluated independently for each pixel. One CPU double-double reference; Metal Float/QS delta work per pixel.
Quadratic term Present in the direct recurrence. Present in the full perturbation recurrence; not truncated.
Parallel work CPU tiles and direct deep arithmetic. Bounded center-out Metal tiles with progressive presentation over an initialized retained preview.
Interaction Legacy deep-rendering presentation behavior. Retained complete frame follows gestures; percentage reports final-frame work.
Failure handling Serves as the recovery renderer. Growth checks, QS restart/rebase/recovery, completion validation, then CPU fallback if needed.

Measured full-frame result

In the published build 548 benchmark on an iPhone 17 Pro Max running iOS 26.6.1, ten exported-bookmark scenes averaged 203.890 seconds in the previous release and 42.419 seconds in Version 3: 4.81× aggregate speedup, or 79.2% less elapsed time. Earth Elephants measured 12.245 seconds versus 3.714 seconds (3.30×). Each run covered bookmark application through presentation of the complete 1320 × 2868 fractal, in forward and reverse order; these are device- and scene-specific measurements, not a universal speed guarantee.

The timing corpus used build 548, one sample per Infinity pixel, and High Quality Idle off. Each version ran once in forward order and once in reverse; those two passes do not establish a statistical confidence interval. They are not timings for the build 582 lighting implementation.

A separate historical Earth Elephants comparison matched 420,640 pixels against an all-QS control with zero differing pixels. Agreement with a related control checks adaptive routing; it is not an independent mathematical proof. Current regression evidence and reproduction requirements are documented in Revision 17 of the white paper.

Looking Ahead

Version 3.0 establishes the first production Infinity Engine within a validated 1025× viewport boundary. Later work can extend the architecture without overstating the precision available today:

  • Reference-coordinate precision — Preserve more exact viewport information before it becomes the CPU reference parameter and GPU pixel offset.
  • Orbit reuse and smarter reference selection — Reuse compatible reference work and minimize perturbation growth across nearby committed views.
  • Bounded series acceleration — Investigate Taylor or block-linear approximations only with explicit validity tests and recovery behavior.
  • Diagnostics and qualification — Expand deterministic image checks and physical-device coverage before raising the public scale ceiling.

The design goal is not a larger number in the HUD by itself. A future ceiling should rise only when navigation, bookmark restoration, visual continuity, and complete-frame correctness remain trustworthy at that depth.

Version 3.0 build 582 source review · September 17, 2026. Historical measurements retain their original build and device scope.