diff options
author | Gael Guennebaud <g.gael@free.fr> | 2015-06-23 15:05:20 +0200 |
---|---|---|
committer | Gael Guennebaud <g.gael@free.fr> | 2015-06-23 15:05:20 +0200 |
commit | c3e398d138f5877b156a7cdbbee47d4a86631190 (patch) | |
tree | 4a7f63c22a8f0cf56619d587f89afa63ee1b6f6f /test/svd_common.h | |
parent | b0d08869a97b6ce94ce6590e91a1e7b79dd21f05 (diff) |
Fix overflow when checking SVD accuracy
Diffstat (limited to 'test/svd_common.h')
-rw-r--r-- | test/svd_common.h | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/test/svd_common.h b/test/svd_common.h index e300336c6..d8611b541 100644 --- a/test/svd_common.h +++ b/test/svd_common.h @@ -33,6 +33,7 @@ void svd_check_full(const MatrixType& m, const SvdType& svd) }; typedef typename MatrixType::Scalar Scalar; + typedef typename MatrixType::RealScalar RealScalar; typedef Matrix<Scalar, RowsAtCompileTime, RowsAtCompileTime> MatrixUType; typedef Matrix<Scalar, ColsAtCompileTime, ColsAtCompileTime> MatrixVType; @@ -40,7 +41,10 @@ void svd_check_full(const MatrixType& m, const SvdType& svd) sigma.diagonal() = svd.singularValues().template cast<Scalar>(); MatrixUType u = svd.matrixU(); MatrixVType v = svd.matrixV(); - VERIFY_IS_APPROX(m, u * sigma * v.adjoint()); + RealScalar scaling = m.cwiseAbs().maxCoeff(); + if(scaling<=(std::numeric_limits<RealScalar>::min)()) + scaling = RealScalar(1); + VERIFY_IS_APPROX(m/scaling, u * (sigma/scaling) * v.adjoint()); VERIFY_IS_UNITARY(u); VERIFY_IS_UNITARY(v); } |