diff --git a/Eigen/src/Eigenvalues/ComplexEigenSolver.h b/Eigen/src/Eigenvalues/ComplexEigenSolver.h index 50fa3b809..c0aae46ff 100644 --- a/Eigen/src/Eigenvalues/ComplexEigenSolver.h +++ b/Eigen/src/Eigenvalues/ComplexEigenSolver.h @@ -265,8 +265,6 @@ template void ComplexEigenSolver::doComputeEigenvectors(RealScalar matrixnorm) { const Index n = m_eivalues.size(); - matrixnorm = numext::maxi(matrixnorm, (std::numeric_limits::min)()); - // Compute X such that T = X D X^(-1), where D is the diagonal of T. // The matrix X is unit triangular. m_matX = EigenvectorType::Zero(n, n); @@ -282,7 +280,8 @@ void ComplexEigenSolver::doComputeEigenvectors(RealScalar matrixnorm if (z == ComplexScalar(0)) { // If the i-th and k-th eigenvalue are equal, then z equals 0. // Use a small value instead, to prevent division by zero. - numext::real_ref(z) = NumTraits::epsilon() * matrixnorm; + numext::real_ref(z) = numext::maxi(std::numeric_limits::epsilon() * matrixnorm, + (std::numeric_limits::min)()); } m_matX.coeffRef(i, k) = m_matX.coeff(i, k) / z; } diff --git a/test/eigensolver_complex.cpp b/test/eigensolver_complex.cpp index 76846a933..159009260 100644 --- a/test/eigensolver_complex.cpp +++ b/test/eigensolver_complex.cpp @@ -132,7 +132,8 @@ void eigensolver(const MatrixType& m) { ComplexEigenSolver ei3(a); VERIFY_IS_EQUAL(ei3.info(), Success); VERIFY_IS_MUCH_SMALLER_THAN(ei3.eigenvalues().norm(), RealScalar(1)); - VERIFY((ei3.eigenvectors().transpose() * ei3.eigenvectors().transpose()).eval().isIdentity()); + RealScalar tol = 2 * a.cols() * NumTraits::epsilon(); + VERIFY((ei3.eigenvectors().adjoint() * ei3.eigenvectors()).eval().isIdentity(tol)); } } diff --git a/test/eigensolver_generic.cpp b/test/eigensolver_generic.cpp index c665df8d8..dafaf99b3 100644 --- a/test/eigensolver_generic.cpp +++ b/test/eigensolver_generic.cpp @@ -89,7 +89,8 @@ void eigensolver(const MatrixType& m) { EigenSolver ei3(a); VERIFY_IS_EQUAL(ei3.info(), Success); VERIFY_IS_MUCH_SMALLER_THAN(ei3.eigenvalues().norm(), RealScalar(1)); - VERIFY((ei3.eigenvectors().transpose() * ei3.eigenvectors().transpose()).eval().isIdentity()); + RealScalar tol = 2 * a.cols() * NumTraits::epsilon(); + VERIFY((ei3.eigenvectors().adjoint() * ei3.eigenvectors()).eval().isIdentity(tol)); } } diff --git a/test/eigensolver_selfadjoint.cpp b/test/eigensolver_selfadjoint.cpp index 12bc3b1f7..7cc4d636f 100644 --- a/test/eigensolver_selfadjoint.cpp +++ b/test/eigensolver_selfadjoint.cpp @@ -197,7 +197,8 @@ void selfadjointeigensolver(const MatrixType& m) { SelfAdjointEigenSolver ei3(a); VERIFY_IS_EQUAL(ei3.info(), Success); VERIFY_IS_MUCH_SMALLER_THAN(ei3.eigenvalues().norm(), RealScalar(1)); - VERIFY((ei3.eigenvectors().transpose() * ei3.eigenvectors().transpose()).eval().isIdentity()); + RealScalar tol = 2 * a.cols() * NumTraits::epsilon(); + VERIFY((ei3.eigenvectors().adjoint() * ei3.eigenvectors()).eval().isIdentity(tol)); } }