Here's my proposal (which I think is what you proposed at the beginning):

* Use PDataType.MAX_PRECISION for all intermediate calculations
* Just do the sqrt using the regular Math.sqrt on a double. We'll doc this and revisit if we get any complaints.
* In the constructor, pre-compute the precision/scale using the "Others" rule in the link Tony sent out.
* For the final calculation, use the precision/scale.

I think this is simpler, will perform reasonably well, and be accurate enough.