Exemplo n.º 1
0
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();
	}

}
Exemplo n.º 2
0
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
}