| // SPDX-FileCopyrightText: The Eigen Authors | |
| // SPDX-License-Identifier: MPL-2.0 | |
| #ifdef EIGEN_DEFAULT_DENSE_INDEX_TYPE | |
| #undef EIGEN_DEFAULT_DENSE_INDEX_TYPE | |
| #endif | |
| #define EIGEN_DEFAULT_DENSE_INDEX_TYPE int | |
| #include "main.h" | |
| #include <contrib/Eigen/StructuredMatrices> | |
| using namespace Eigen; | |
| // Roughly 2.2 million factors near the top of the double range exceed a | |
| // 32-bit Index exponent even though the determinant has the unambiguous result | |
| // +Inf. The internal exponent type must not wrap. | |
| void test_vandermonde_determinant_int_index() { | |
| typedef Matrix<double, Dynamic, 1> Vec; | |
| const Index n = 2100; | |
| const double low = -9e307, high = 9e307; | |
| Vec x(n); | |
| for (Index i = 0; i < n; ++i) { | |
| const double t = double(i) / double(n - 1); | |
| x[i] = (1.0 - t) * low + t * high; | |
| } | |
| const double det = Vandermonde<double>(x).determinant(); | |
| VERIFY((numext::isinf)(det)); | |
| VERIFY(det > 0.0); | |
| } | |
| EIGEN_DECLARE_TEST(structured_vandermonde_int_index) { | |
| STATIC_CHECK(sizeof(Index) == sizeof(int)); | |
| CALL_SUBTEST_1(test_vandermonde_determinant_int_index()); | |
| } |