...one of the most highly
regarded and expertly designed C++ library projects in the
world.

— Herb Sutter and Andrei
Alexandrescu, C++
Coding Standards

template <class T1, class T2>calculated-result-typehypot(T1 x, T2 y); template <class T1, class T2, class Policy>calculated-result-typehypot(T1 x, T2 y, const Policy&);

**Effects: ** computes

in such a way as to avoid undue underflow and overflow.

The return type of this function is computed using the *result
type calculation rules* when T1 and T2 are of different
types.

The final Policy argument is optional and can be used to control the behaviour of the function: how it handles errors, what level of precision to use etc. Refer to the policy documentation for more details.

When calculating

it's quite easy for the intermediate terms to either overflow or underflow, even though the result is in fact perfectly representable.

The function is even and symmetric in *x* and *y*,
so first take assume *x,y > 0* and *x >
y* (we can permute the arguments if this is not the case).

Then if *x * ε >= y* we can simply return *x*.

Otherwise the result is given by: