diff --git a/Eigen/src/Core/MathFunctions.h b/Eigen/src/Core/MathFunctions.h index ff4e520f3..8f56ef40e 100644 --- a/Eigen/src/Core/MathFunctions.h +++ b/Eigen/src/Core/MathFunctions.h @@ -34,6 +34,16 @@ template inline T ei_random_amplitude() else return static_cast(10); } +template inline T ei_hypot(T x, T y) +{ + T _x = ei_abs(x); + T _y = ei_abs(y); + T p = std::max(_x, _y); + T q = std::min(_x, _y); + T qp = q/p; + return p * ei_sqrt(T(1) + qp*qp); +} + /************** *** int *** **************/ @@ -94,7 +104,6 @@ inline float ei_log(float x) { return std::log(x); } inline float ei_sin(float x) { return std::sin(x); } inline float ei_cos(float x) { return std::cos(x); } inline float ei_pow(float x, float y) { return std::pow(x, y); } -inline float ei_hypot(float x, float y) { return float(hypot(double(x),double(y))); } template<> inline float ei_random(float a, float b) { @@ -140,7 +149,6 @@ inline double ei_log(double x) { return std::log(x); } inline double ei_sin(double x) { return std::sin(x); } inline double ei_cos(double x) { return std::cos(x); } inline double ei_pow(double x, double y) { return std::pow(x, y); } -inline double ei_hypot(double x, double y) { return hypot(x,y); } template<> inline double ei_random(double a, double b) {