| #include <unsupported/Eigen/Polynomials> | 
 | #include <vector> | 
 | #include <iostream> | 
 |  | 
 | using namespace Eigen; | 
 | using namespace std; | 
 |  | 
 | int main() { | 
 |   typedef Matrix<double, 5, 1> Vector5d; | 
 |  | 
 |   Vector5d roots = Vector5d::Random(); | 
 |   cout << "Roots: " << roots.transpose() << endl; | 
 |   Eigen::Matrix<double, 6, 1> polynomial; | 
 |   roots_to_monicPolynomial(roots, polynomial); | 
 |  | 
 |   PolynomialSolver<double, 5> psolve(polynomial); | 
 |   cout << "Complex roots: " << psolve.roots().transpose() << endl; | 
 |  | 
 |   std::vector<double> realRoots; | 
 |   psolve.realRoots(realRoots); | 
 |   Map<Vector5d> mapRR(&realRoots[0]); | 
 |   cout << "Real roots: " << mapRR.transpose() << endl; | 
 |  | 
 |   cout << endl; | 
 |   cout << "Illustration of the convergence problem with the QR algorithm: " << endl; | 
 |   cout << "---------------------------------------------------------------" << endl; | 
 |   Eigen::Matrix<float, 7, 1> hardCase_polynomial; | 
 |   hardCase_polynomial << -0.957, 0.9219, 0.3516, 0.9453, -0.4023, -0.5508, -0.03125; | 
 |   cout << "Hard case polynomial defined by floats: " << hardCase_polynomial.transpose() << endl; | 
 |   PolynomialSolver<float, 6> psolvef(hardCase_polynomial); | 
 |   cout << "Complex roots: " << psolvef.roots().transpose() << endl; | 
 |   Eigen::Matrix<float, 6, 1> evals; | 
 |   for (int i = 0; i < 6; ++i) { | 
 |     evals[i] = std::abs(poly_eval(hardCase_polynomial, psolvef.roots()[i])); | 
 |   } | 
 |   cout << "Norms of the evaluations of the polynomial at the roots: " << evals.transpose() << endl << endl; | 
 |  | 
 |   cout << "Using double's almost always solves the problem for small degrees: " << endl; | 
 |   cout << "-------------------------------------------------------------------" << endl; | 
 |   PolynomialSolver<double, 6> psolve6d(hardCase_polynomial.cast<double>()); | 
 |   cout << "Complex roots: " << psolve6d.roots().transpose() << endl; | 
 |   for (int i = 0; i < 6; ++i) { | 
 |     std::complex<float> castedRoot(psolve6d.roots()[i].real(), psolve6d.roots()[i].imag()); | 
 |     evals[i] = std::abs(poly_eval(hardCase_polynomial, castedRoot)); | 
 |   } | 
 |   cout << "Norms of the evaluations of the polynomial at the roots: " << evals.transpose() << endl << endl; | 
 |  | 
 |   cout.precision(10); | 
 |   cout << "The last root in float then in double: " << psolvef.roots()[5] << "\t" << psolve6d.roots()[5] << endl; | 
 |   std::complex<float> castedRoot(psolve6d.roots()[5].real(), psolve6d.roots()[5].imag()); | 
 |   cout << "Norm of the difference: " << std::abs(psolvef.roots()[5] - castedRoot) << endl; | 
 | } |