EquationRoots CEquationSolver::GetEquationRoots() const { const auto epsilon = std::numeric_limits<double>::epsilon(); if (std::abs(m_a) > epsilon) { double discr = m_b * m_b - 4 * m_a * m_c; if (discr < 0) { return NoRealRoots(); } else if (discr < std::numeric_limits<double>::epsilon()) { return (-m_b + std::sqrt(discr)) / (2 * m_a); } else { return std::make_pair((-m_b - std::sqrt(discr)) / (2 * m_a), (-m_b + std::sqrt(discr)) / (2 * m_a)); } } // linear equation b*x + c = 0 if (std::abs(m_b) >= epsilon) { return -m_c / m_b; } else if (std::abs(m_c) >= epsilon) { return NoRealRoots(); } else // 0*x = 0 { return InfiniteNumberOfRoots(); } }
QuadraticEquationSolution ComputeRoots(const double & a, const double & b, const double & c) { if (a == 0) { return NotAQuadraticEquation(); } const double discriminant = ComputeDiscriminant(a, b, c); if (discriminant < 0) { return NoRealRoots(); } if (discriminant == 0) { return -b / 2 * a; // one root } return std::make_pair((-b + sqrt(discriminant)) / (2 * a), (-b - sqrt(discriminant)) / (2 * a)); // Two roots }