65.9K
CodeProject is changing. Read more.
Home

A simple program to solve quadratic equations with

emptyStarIconemptyStarIconemptyStarIconemptyStarIconemptyStarIcon

0/5 (0 vote)

Nov 9, 2010

CPOL
viewsIcon

5920

I am reposting this because I accidentally deleted my first post.The solution is presented as a pair of complex roots, unless a == 0, in which case the equation is linear and returns a single complex(real) root.If a == 0 and b == 0, the function fails.Given a complex type, replace...

I am reposting this because I accidentally deleted my first post. The solution is presented as a pair of complex roots, unless a == 0, in which case the equation is linear and returns a single complex(real) root. If a == 0 and b == 0, the function fails. Given a complex type, replace the real and imaginary type double arrays with a single type complex array . Likewise, if there is a preferred method for establishing floating point equality with 0, replace the boolean aIsZero and bIsZero flags as necesary.
bool Quadratic(double a, double b, double c, CArray<double,>& real, CArray<double,>& imaginary)
{
	bool bReturn = true;

	real.RemoveAll();
	imaginary.RemoveAll();

	bool aIsZero = !((a > 0) || (a < 0));
	bool bIsZero = !((b > 0) || (b < 0));

	if(aIsZero)	//	a == 0, so linear, not quadratic
	{
		if(bIsZero)	//	undefined behavior, fail function
		{
			real.SetSize(0);
			imaginary.SetSize(0);

			bReturn = false;
		}
		else
		{
			real.SetSize(1);
			imaginary.SetSize(1);

			real[0] = -c/b;
			imaginary[0] = 0.0;
		}
	}
	else
	{
		real.SetSize(2);
		imaginary.SetSize(2);

		double dDiscriminant = b*b - 4.0 * a * c;

		if(dDiscriminant < 0)	//	imaginary roots
		{
			real[0] = -b / 2.0 / a;
			real[1] = real[0];

			imaginary[0] = sqrt(-dDiscriminant) / 2.0 / a;
			imaginary[1] = -imaginary[0];
		}
		else	//	real roots, duplicate roots if dDiscriminant == 0
		{
			real[0] = (-b + sqrt(dDiscriminant)) / 2.0 / a;
			real[1] = (-b - sqrt(dDiscriminant)) / 2.0 / a;

			imaginary[0] = 0.0;
			imaginary[1] = 0.0;
		}
	}

	return bReturn;
}