Whatever you do, it will have to be iterative/adaptive with feedback because subtraction, root, etc. convert numbers with N digits of significance to results with fewer significant digits. Thus to get K significant digits in the final result you need to be prepared to repeat the computation with increasing significance of the intermediary results.

@TomP That's a really useful "negative "insight. You're basically saying

a - b == (10^N + a) - (10^N + b)

So as a result, I can't just "make one pass through the tree bottom up", because it's not clear how many digits we need to keep. It's only when we hit the "`" that we get the "oh $&#(" moment and realize the two numbers are really realy close and thus we need more digits on both #'s.

I feel like this has to be a well studied problem in CS. Any idea on what terms to google for?