blob: 5992f9e38200e2d443e8c08db512eb3cf5629a85 [file] [log] [blame]
#include <algorithm>
#include <cmath>
extern "C" {
float slapy2_(float* x, float* y);
double dlapy2_(double* x, double* y);
}
// Compute sqrt(x*x + y*y) taking care not to cause unnecessary overflow.
template <typename T>
T xlapy2(const T x, const T y) {
const T xabs = std::abs(x);
const T yabs = std::abs(y);
const T w = std::fmax(xabs, yabs);
const T z = std::fmin(xabs, yabs);
if (z > T(0)) {
const T t = z / w;
return w * std::sqrt(T(1) + t * t);
}
return w;
}
float slapy2_(float* x, float* y) { return xlapy2(*x, *y); }
double dlapy2_(double* x, double* y) { return xlapy2(*x, *y); }