public void Solve_2()
        {
            void Test(double c)
            {
                var actual = target2(c);
                var det    = -c;

                Assert.AreEqual(det < 0 ? 0 : det == 0 ? 1 : 2, actual.Length);

                var f = QuadraticEquation1.CreateFunction(c);

                foreach (var x in actual)
                {
                    Assert2.AreNearlyEqual(0, f(x));
                }
            }

            for (int c = -1000; c <= 1000; c++)
            {
                Test(c);
            }
            for (int c1 = 1; c1 <= 100; c1++)
            {
                for (double c2 = -100; c2 <= 100; c2++)
                {
                    Test(c2 / c1);
                }
            }
        }
        public void Solve_1()
        {
            void Test(double a, double b, double c)
            {
                var actual = target1(a, b, c);
                var det    = b * b - 4 * a * c;

                // Errors can be occurred.
                Assert.AreEqual(det < 0 ? 0 : det == 0 ? 1 : 2, actual.Length);

                var f = QuadraticEquation1.CreateFunction(a, b, c);

                foreach (var x in actual)
                {
                    Assert2.AreNearlyEqual(0, f(x), -9);
                }
            }

            // A case with error for c - b * b / 4.
            Test(100, 80, 16);

            for (int a = -50; a <= 50; a++)
            {
                if (a != 0)
                {
                    for (int b = -50; b <= 50; b++)
                    {
                        for (int c = -50; c <= 50; c++)
                        {
                            Test(a, b, c);
                        }
                    }
                }
            }
        }