diff options
author | Gael Guennebaud <g.gael@free.fr> | 2016-07-12 17:21:03 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2016-07-12 17:21:03 +0200 |
commit | e2aa58b6316ba869be039e49dce73f99647f4139 (patch) | |
tree | 13e0f9182f1c49ad9630d3597d0339157ad5204e /Eigen/src/Jacobi | |
parent | 263993a7b61959111dd39d5e1cbb5ed861263d46 (diff) |
Consider denormals as zero in makeJacobi and 2x2 SVD.
This also fix serious issues with x387 for which values can be much smaller than the smallest denormal!
Diffstat (limited to 'Eigen/src/Jacobi')
-rw-r--r-- | Eigen/src/Jacobi/Jacobi.h | 5 |
1 files changed, 3 insertions, 2 deletions
diff --git a/Eigen/src/Jacobi/Jacobi.h b/Eigen/src/Jacobi/Jacobi.h index 55de15e87..d25af8e90 100644 --- a/Eigen/src/Jacobi/Jacobi.h +++ b/Eigen/src/Jacobi/Jacobi.h @@ -85,7 +85,8 @@ bool JacobiRotation<Scalar>::makeJacobi(const RealScalar& x, const Scalar& y, co using std::sqrt; using std::abs; typedef typename NumTraits<Scalar>::Real RealScalar; - if(y == Scalar(0)) + RealScalar deno = RealScalar(2)*abs(y); + if(deno < (std::numeric_limits<RealScalar>::min)()) { m_c = Scalar(1); m_s = Scalar(0); @@ -93,7 +94,7 @@ bool JacobiRotation<Scalar>::makeJacobi(const RealScalar& x, const Scalar& y, co } else { - RealScalar tau = (x-z)/(RealScalar(2)*abs(y)); + RealScalar tau = (x-z)/deno; RealScalar w = sqrt(numext::abs2(tau) + RealScalar(1)); RealScalar t; if(tau>RealScalar(0)) |