At the risk of being irritating, I'm going to ask just the opposite question. ;-)
Why is hypot (for example) templated?
Good question, I needed hypot to implement some of the complex number stuff, and it's a template because it was possible to make it one :-)
template <class T> T hypot(T x, T y);
If the intent is to implement 8.16.4 (from N1836), I don't think this does it. Consider this test for example:
I'm aware of those nasties, but <cmath> is *not* part of the current submission, well that's my excuse anyway. Basically hypot/log1p/expm1 are some internals I needed and it seems a shame not to expose them in Boost.Math. I have jumped though hoops however to make sure that <complex> does the right thing with for example: polar(2.3, char(1)); // expression returns a std::complex<double>
Also do we want to support infinities and nans?
assert(hypot(INFINITY, sqrt(-1.)) == INFINITY);
Hmm, what does C99 say about this, I can see anything obvious at first glance? Your suggestion matches what the complex number functions are required to do however, so it's probably in there somewhere, I just can't see it at present. I'm not sure I handle range errors correctly either (setting errno that is). It would certainly be easy enough to convert those functions into non-template inlines that forward to the template implementation, and make them C99 conforming in the process (once I've figured out what that is!) Thanks for raising this, John.