| // 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); | |
| } | |
| // The scaled-Horner frame can likewise exceed a 32-bit Index exponent. A | |
| // degree-2,099,999 monomial at DBL_MAX must overflow to +Inf rather than wrap | |
| // its accumulated exponent and underflow to zero. | |
| void test_vandermonde_scaled_horner_int_index() { | |
| typedef Matrix<double, Dynamic, 1> Vec; | |
| const Index n = 2100000; | |
| Vec x(1), a = Vec::Zero(n); | |
| x[0] = (std::numeric_limits<double>::max)(); | |
| a[n - 1] = 1.0; | |
| Vec y = Vandermonde<double>(x, n) * a; | |
| VERIFY((numext::isinf)(y[0])); | |
| VERIFY(y[0] > 0.0); | |
| } | |
| EIGEN_DECLARE_TEST(structured_vandermonde_int_index) { | |
| STATIC_CHECK(sizeof(Index) == sizeof(int)); | |
| CALL_SUBTEST_1(test_vandermonde_determinant_int_index()); | |
| CALL_SUBTEST_2(test_vandermonde_scaled_horner_int_index()); | |
| } |