diff options
author | Antonio Sanchez <cantonios@cantonios-macbookair.roam.corp.google.com> | 2020-04-07 09:30:16 -0700 |
---|---|---|
committer | Antonio Sánchez <cantonios@google.com> | 2020-04-07 19:48:28 +0000 |
commit | 8e875719b3ca27a05b58c77010d2fa10af3094a3 (patch) | |
tree | 7b27105e7361c68da29ef367684e91c8a1d7bd91 /test/stl_iterators.cpp | |
parent | 9dda5eb7d243f7dc3797ea7b17a26704da2891da (diff) |
Replace norm() with squaredNorm() to address integer overflows
For random matrices with integer coefficients, many of the tests here lead to
integer overflows. When taking the norm() of a row/column, the squaredNorm()
often overflows to a negative value, leading to domain errors when taking the
sqrt(). This leads to a crash on some systems. By replacing the norm() call by
a squaredNorm(), the values still overflow, but at least there is no domain
error.
Addresses https://gitlab.com/libeigen/eigen/-/issues/1856
Diffstat (limited to 'test/stl_iterators.cpp')
-rw-r--r-- | test/stl_iterators.cpp | 10 |
1 files changed, 5 insertions, 5 deletions
diff --git a/test/stl_iterators.cpp b/test/stl_iterators.cpp index 9ede923ee..25468eb49 100644 --- a/test/stl_iterators.cpp +++ b/test/stl_iterators.cpp @@ -431,22 +431,22 @@ void test_stl_iterators(int rows=Rows, int cols=Cols) { RowVectorType row = RowVectorType::Random(cols); A.rowwise() = row; - VERIFY( std::all_of(A.rowwise().begin(), A.rowwise().end(), [&row](typename ColMatrixType::RowXpr x) { return internal::isApprox(x.norm(),row.norm()); }) ); + VERIFY( std::all_of(A.rowwise().begin(), A.rowwise().end(), [&row](typename ColMatrixType::RowXpr x) { return internal::isApprox(x.squaredNorm(),row.squaredNorm()); }) ); VectorType col = VectorType::Random(rows); A.colwise() = col; - VERIFY( std::all_of(A.colwise().begin(), A.colwise().end(), [&col](typename ColMatrixType::ColXpr x) { return internal::isApprox(x.norm(),col.norm()); }) ); - VERIFY( std::all_of(A.colwise().cbegin(), A.colwise().cend(), [&col](typename ColMatrixType::ConstColXpr x) { return internal::isApprox(x.norm(),col.norm()); }) ); + VERIFY( std::all_of(A.colwise().begin(), A.colwise().end(), [&col](typename ColMatrixType::ColXpr x) { return internal::isApprox(x.squaredNorm(),col.squaredNorm()); }) ); + VERIFY( std::all_of(A.colwise().cbegin(), A.colwise().cend(), [&col](typename ColMatrixType::ConstColXpr x) { return internal::isApprox(x.squaredNorm(),col.squaredNorm()); }) ); i = internal::random<Index>(0,A.rows()-1); A.setRandom(); A.row(i).setZero(); - VERIFY_IS_EQUAL( std::find_if(A.rowwise().begin(), A.rowwise().end(), [](typename ColMatrixType::RowXpr x) { return x.norm() == Scalar(0); })-A.rowwise().begin(), i ); + VERIFY_IS_EQUAL( std::find_if(A.rowwise().begin(), A.rowwise().end(), [](typename ColMatrixType::RowXpr x) { return x.squaredNorm() == Scalar(0); })-A.rowwise().begin(), i ); j = internal::random<Index>(0,A.cols()-1); A.setRandom(); A.col(j).setZero(); - VERIFY_IS_EQUAL( std::find_if(A.colwise().begin(), A.colwise().end(), [](typename ColMatrixType::ColXpr x) { return x.norm() == Scalar(0); })-A.colwise().begin(), j ); + VERIFY_IS_EQUAL( std::find_if(A.colwise().begin(), A.colwise().end(), [](typename ColMatrixType::ColXpr x) { return x.squaredNorm() == Scalar(0); })-A.colwise().begin(), j ); } { |