public static double Hypot(double x, double y) {
//
// sqrt(x*x + y*y) == sqrt(x*x * (1 + (y*y)/(x*x))) ==
// sqrt(x*x) * sqrt(1 + (y/x)*(y/x)) ==
// abs(x) * sqrt(1 + (y/x)*(y/x))
//
// Handle infinities
if (double.IsInfinity(x) || double.IsInfinity(y)) {
return double.PositiveInfinity;
}
// First, get abs
if (x < 0.0) x = -x;
if (y < 0.0) y = -y;
// Obvious cases
if (x == 0.0) return y;
if (y == 0.0) return x;
// Divide smaller number by bigger number to safeguard the (y/x)*(y/x)
if (x < y) {
double temp = y; y = x; x = temp;
}
y /= x;
// calculate abs(x) * sqrt(1 + (y/x)*(y/x))
return x * System.Math.Sqrt(1 + y * y);
}