Aim a ray of light at a pair of black holes and it can end in one of three ways. It falls into one hole, it falls into the other, or it gets past both and flies off. Most rays decide at once. A few, aimed near the line between two outcomes, get caught circling between the holes before they decide, and those rays have a strange property. However closely you look at the boundary between the outcomes, it keeps breaking into more boundary. That is a fractal, and this one is not a drawing. Every ray in this post was traced through curved spacetime by the engine behind this blog, one at a time.
Two holes that sit still
General relativity has no exact solution for two ordinary black holes side by side, because two masses attract and will not stay put. There is one arrangement that does sit still. Give each hole an electric charge exactly equal to its mass, in the natural units where G and c are 1, and the electric repulsion cancels the gravitational pull at every distance. That solution is called Majumdar-Papapetrou, and the whole metric fits in four lines.
Real black holes carry almost no charge, so this is not a picture of anything in the sky. What it gives is an exact geometry to trace light through, with no approximation except the step size of the integrator. The engine checks it the way it checks everything else. It is not Ricci-flat, because the electric field holding the holes apart has energy. But its Ricci scalar is zero, because that energy's stress is traceless, and the test suite requires both.
Distances here are in units of one hole's mass. For two holes each the mass of the Sun, one unit is 1.48 kilometres, so these holes sit 3 kilometres apart.
What a camera would see
Here is the pair seen from 40 units away, with one ray per pixel: 30,000 rays, each traced until it falls in or leaves. The colour says where it ended.

Each hole casts its own shadow, the two lobes. Around the outside of each is a thin crescent of the other colour: rays that swung round one hole and fell into the other. The pale ring is light thrown back toward the camera, bent through more than a right angle.
The strips on the right zoom in on the gap between the lobes. Each one is eight times narrower than the one above it, and each is 240 rays across. The last is 32,768 times narrower than the first and still holds all three outcomes, with seven changes of fate across it. For two holes of the Sun's mass that window is 2.7 centimetres wide.
Two rays a hair apart
Chaos in the everyday sense means a tiny difference at the start becomes a big difference at the end. Here is how tiny:

These two rays leave the screen 7.6 × 10^-8 units apart, which for Sun-mass holes is a tenth of a millimetre. They travel together, loop round the pair several times on paths you cannot tell apart, and then one is flung away while the other is caught. The four faint rays are what most rays do: they are aimed a little further out and fall straight in, or pass straight through between the holes, without circling at all.
The number after each ending is how long the ray spent in the engine's own measure, its affine length. The rays that decide late are the ones on the boundary, and that turned out to be the most useful fact in the whole investigation.
Here are 36 rays aimed across the last, narrowest window, traced out:

Nineteen escape, thirteen fall into the upper hole and four into the lower, from a spread of aims that for Sun-mass holes is 2.7 centimetres wide.
Try it yourself. The widget fires rays through the same module the engine uses, in your browser. Slide the aim, then zoom in wherever the colours change:
Three wrong places to look
The structure took three attempts to find, and the first wrong answer is the reason this post exists.
The obvious place to look was the edge of a shadow, where the lobes meet the dark. I put the holes eight units apart and fired four thousand rays across one edge. They found eight changes of fate. Box counting, the standard way to measure a fractal's dimension, levelled off at six boxes and reported a dimension of zero: a finite set of points, no fractal at all. That was a well-formed number from a correct method, and it was the wrong answer to the question I was asking. At that distance the holes were too far apart to pass light between them. Each one behaved like a single black hole, and a single hole has one sharp edge and nothing else.
This blog keeps coming back to that shape: a system that returns a sensible-looking answer which happens to be false. The closest sample is not the closest approach was a coarse scan that missed what happened between its samples. This was a coarse scan in the wrong place.
The structure is in the gap between the holes, when they are a couple of units apart and can hand light to each other. What found it was the time a ray spends deciding, the gold line in the first figure. On a scan far too coarse to resolve any boundary, the rays near one still take visibly longer than their neighbours, because they are caught circling. The engine reports that as a dwell profile, and wherever rays linger is where to zoom. Every window it zoomed into from there, down to 1.8 × 10^-5 units, showed more than one outcome.
The structure is certain. The dimension is not.
Those are different claims, and the engine keeps them apart.
That there is structure at every scale it could reach is a direct observation: six nested windows, a factor of 32,768, three outcomes in every one. How much structure, the fractal dimension, is a number the engine measures two independent ways:
- Box counting over a scan of 600 rays: 0.21, with a spread of 0.10.
- The uncertainty exponent, which fires 80 pairs of rays a small distance apart and counts how often the two disagree, then watches how that fraction shrinks as the pairs get closer. It uses no grid and counts no boxes. At a separation of 0.02 units, 43 percent of pairs disagreed; at 0.001, 2.5 percent. That gives 0.18, with a spread of 0.29.
The two agree to within 0.035, and one of them has an error bar wider than itself. So the honest statement is that the boundary is a fractal, and its dimension along this line is probably around 0.2, and I do not know it to better than a factor of two. A uniform scan cannot resolve every scale at once, and this boundary keeps going below whatever a scan can afford. The engine never quotes the dimension without that gap attached.
The machinery underneath, geodesics and curvature checked against the great theorems, is in A Klein Bottle Has No Inside. This is the first thing it has found that I could not have drawn by hand.