aboutsummaryrefslogtreecommitdiffhomepage
path: root/test/svd_common.h
diff options
context:
space:
mode:
authorGravatar Gael Guennebaud <g.gael@free.fr>2015-06-23 15:05:20 +0200
committerGravatar Gael Guennebaud <g.gael@free.fr>2015-06-23 15:05:20 +0200
commitc3e398d138f5877b156a7cdbbee47d4a86631190 (patch)
tree4a7f63c22a8f0cf56619d587f89afa63ee1b6f6f /test/svd_common.h
parentb0d08869a97b6ce94ce6590e91a1e7b79dd21f05 (diff)
Fix overflow when checking SVD accuracy
Diffstat (limited to 'test/svd_common.h')
-rw-r--r--test/svd_common.h6
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);
}