On the left is hardware bilinear sampling.

On the right is bilinear interpolation in a pixel shader with floats, after sampling each of the four pixels involved, to preform the bilinear interpolation.

No matter what I do, I cannot seem to make the hardware bilinear sample higher quality. Some of the things I've tried include using highp precision on the types as well as the sampler, and have also tried floating point textures.