From 537a978dcfed3f299308fc7ed0cfcde9664121ee Mon Sep 17 00:00:00 2001 From: Viet Dinh Date: Tue, 3 Nov 2015 12:52:49 -0500 Subject: [PATCH] update test_math.cpp --- modules/core/test/test_math.cpp | 49 +++++++++++++++++++++++++++++++++++++++++ 1 file changed, 49 insertions(+) diff --git a/modules/core/test/test_math.cpp b/modules/core/test/test_math.cpp index d2c0695..8520def 100644 --- a/modules/core/test/test_math.cpp +++ b/modules/core/test/test_math.cpp @@ -2348,6 +2348,55 @@ void Core_SolvePolyTest::run( int ) } } +template +static void checkRoot(Mat& r, T re, T im) +{ + for (size_t i = 0; i < r.total(); i++) + { + Vec v = *(Vec*)r.ptr(i); + if (fabs(re - v[0]) < 1e-6 && fabs(im - v[1]) < 1e-6) + { + v[0] = std::numeric_limits::quiet_NaN(); + v[1] = std::numeric_limits::quiet_NaN(); + return; + } + } + GTEST_NONFATAL_FAILURE_("Can't find root") << "(" << re << ", " << im << ")"; +} +TEST(Core_SolvePoly, regression_5599) +{ + // x^4 - x^2 = 0, roots: 1, -1, 0, 0 + cv::Mat coefs = (cv::Mat_(1,5) << 0, 0, -1, 0, 1 ); + { + cv::Mat r; + double prec; + prec = cv::solvePoly(coefs, r); + EXPECT_LE(prec, 1e-6); + EXPECT_EQ(4, (int)r.total()); + //std::cout << "Preciseness = " << prec << std::endl; + //std::cout << "roots:\n" << r << "\n" << std::endl; + ASSERT_EQ(CV_32FC2, r.type()); + checkRoot(r, 1, 0); + checkRoot(r, -1, 0); + checkRoot(r, 0, 0); + checkRoot(r, 0, 0); + } + // x^2 - 2x + 1 = 0, roots: 1, 1 + coefs = (cv::Mat_(1,3) << 1, -2, 1 ); + { + cv::Mat r; + double prec; + prec = cv::solvePoly(coefs, r); + EXPECT_LE(prec, 1e-6); + EXPECT_EQ(2, (int)r.total()); + //std::cout << "Preciseness = " << prec << std::endl; + //std::cout << "roots:\n" << r << "\n" << std::endl; + ASSERT_EQ(CV_32FC2, r.type()); + checkRoot(r, 1, 0); + checkRoot(r, 1, 0); + } +} + class Core_CheckRange_Empty : public cvtest::BaseTest { public: -- 2.7.4