To All:
Be careful when running my code to verify my claimed resolution values. In the following code:
float analog_reading1 = adc.analogReadXXbit(pin,bits_of_precision,num_samples);
be sure to set "num_samples" to 1. If you leave it as 10, or anything but 1, it will take that many samples at the specified resolution, then return the avg of all those samples. This doesn't test just resolution, then, but rather it smoothes the readings too, which will change your results. So, set num_samples to 1.
Now, why did I choose a float? Answer: because A) returning an unsigned long isn't measurably faster (I checked repeatedly), B) if you want an unsigned long you can simply use:
unsigned long analog_reading1 = adc.analogReadXXbit(pin,bits_of_precision,num_samples);
instead, and the returned value will be automatically truncated in order to cast it from a float to an unsigned long; And C) If you make num_samples > 1, you can actually get an avg. reading back, which I wanted back as a float for extra precision. So, if you set num_samples to 2, and set bits_of_precision to 10, the two readings done by the ADC might be 998 and 999, for instance, and I wanted to get back 998.5 as the answer, rather than the truncated 998. That's why I chose a float.