Printers must dither the way they lay down ink. A lot. Printers only have a limited number of inks, usually 8 or a bit more. But one can request 16M colors in 8 bit RGB on a single print area of, perhaps 1/360th or 1/720th inch on a side. At best they can plop down a variety of inks but are limited to, perhaps 50 combinations in such a small area. So what do drivers do? Well, for black, or pure cyan, etc., they can fully populate with black or cyan ink. But what about colors inside the gamut that require some mixing?
What they do is print a dithered pattern of dots based on the RGB values. With 16M RGB combos they lay down a statistical spread of colors that will, on average, produce the desired color and the color will be quite inaccurate if you look too close and start to see the variation from individual ink dots. Further, the dot pattern a printer may print in one place can be and is quite different from the dot pattern in another place even though the RGB values may be identical!
Here's what about a .2" portion of "gray" looks like blown up 20x:
It's a mix of different inks, not just neutral ones.
This was all printed with exactly the same RGB value (105,105,105) at 720DPI so it's pretty apparent that what gets printed varies considerably and is not limited to squares that are 1/720th inch on a side.
So an Experiment on my 8 bit 9800!
Let's print an RGB gradient from 100 to 110 in ProPhoto RGB high (16) bits and do the following.
Convert the 16 bit image to 8 bits, print, and look for banding.
Create images that have decreasing levels of actual RGB bits by forcing all values to integers and zeroing the lower order bits producing increasing coarseness.
One image, the second stripe, uses all 8 bits but the low order bit was statistically altered to be either 0 or 1 based on the value at that location. Thus RGB values of 105.25 would be printed at 105 75% of the time and 106 75% of the time.
Next, on the third strip, we limit the RGB range to values with the lowest order bit set to 0. Now we only have RGB 104 and 106 available. So to "print" 105.25 we will need to have 104 37.5% of the time and 106 62.5% of the time/
Then we do the same for RGB values restricted to:
0,4,8,12, …
0,8,16,32...
0,16,32,48...
0,32,64,96...
And then adjust the printed values proportionally so that the we get the proper average.
That last one is very coarse, with the lowest 5 bits zeroed, allowing only 9 levels: 0,32,64,96,128,160,192,224,255. Printed, it produces significant additional noise. Here's what that looks like using the same area:
Here's an image of the full experiment, downsized to 120 DPI for posting:
The first strip is printed directly with no dithering using the full 8 bits. The rest use dithering too. The second uses 8 bits, the third uses 7 bits, fourth 6 bits, fifth 5 bits, 6th 4 bits, 7th 3 bits.
Amazing how good it looks using only 4 bits of RGB but, with dithering. And the last with only 3 bits, is better than one might expect.
To make the noise more apparent, I used curves to boost the contrast about 10x around the gray. Here's what that same image looks like with heavily boosted contrast:
And here's a graph of the accumulated power noise for each of the strips that shows that there is no difference beyond 4 bits of depth.
The X axis is cycles (aka lines and called LPI hereafter) per inch on the print. The Y axis is accumulated noise power so the slope is the noise power at each LPI. Units on the Y axis are arbitrary and used to compare strips. Interesting that the noise is essentially independent of LPI. Human vision is much more sensitive to noise at low LPIs and insensitive at high LPI levels. So the lines below about 20 LPI are most meaningful.
The top blue outlier line shows is that of last strip. Its dithering uses only 3 bits of RGB and so injects considerable excess noise. The 6th strip (green with 4 bits) has much less noise, and the fifth strip (purple with 5 bits) is extremely close and contributes almost no additional noise. The rest are grouped together and not significantly different from each other.
Conclusion: If your system uses 8 bits, just enable dither on printing. For Photoshop this is the Edit->Settings->Use Dither. It prevents truncation to 8 bits which can create visual banding under unusual circumstances. The printer itself is dithering far more that what Photoshop or Lightroom introduce when converting 16 bit data to 8 bits with dithering enabled.
And, it turns out Lightroom does this automatically.