blob: 9c935fa9d610c01cc088a376ac80314b0844f4a7 [file] [log] [blame]
#include <algorithm>
#include <cmath>
extern "C" {
float slapy3_(float* x, float* y, float* z);
double dlapy3_(double* x, double* y, double* z);
}
// Compute sqrt(x*x + y*y + z*z) taking care not to cause unnecessary overflow.
template <typename T>
T xlapy3(const T x, const T y, const T z) {
const T xabs = std::abs(x);
const T yabs = std::abs(y);
const T zabs = std::abs(z);
const T w = std::fmax(std::fmax(xabs, yabs), zabs);
if (w == T(0)) {
// W can be zero for max(0,nan,0) adding all three entries together will
// make sure NaN will not disappear.
return (xabs + yabs + zabs);
}
const T tx = xabs / w;
const T ty = yabs / w;
const T tz = zabs / w;
return w * std::sqrt(tx * tx + ty * ty + tz * tz);
}
float slapy3_(float* x, float* y, float* z) { return xlapy3(*x, *y, *z); }
double dlapy3_(double* x, double* y, double* z) { return xlapy3(*x, *y, *z); }