Solve Quadratic Equation in C++

NulPtr picture NulPtr · May 22, 2009 · Viewed 15.9k times · Source

I am trying to write a function in C++ that solves for X using the quadratic equation. This is what I have written initially, which seems to work as long as there are no complex numbers for an answer:

float solution1 = (float)(-1.0 * b) + (sqrt((b * b) - (4 * a * c)));
solution1 = solution1 / (2*a);

cout << "Solution 1: " << solution1 << endl;

float solution2 = (float)(-b) - (sqrt((b*b) - (4 * a * c)));
solution2 = solution2 / (2*a);
cout << "Solution 2: " << solution2;

If, for example, I use the equation: x^2 - x - 6, I get the solution 3, -2 correctly.

My question is how would I account for complex numbers....for example, given the equation:

x^2 + 2x + 5

Solving by hand, I would get -1 + 2i, -1 - 2i.

Well, I guess two question, can I write the above better and also make it account for the complex number?

Thanks for any help!

Answer

Andrew Stein picture Andrew Stein · May 22, 2009

An important note to all of this. The solutions shown in these responses and in the original question are not robust.

The well known solution (-b +- sqrt(b^2 - 4ac)) / 2a is known to be non-robust in computation when ac is very small compered to b^2, because one is subtracting two very similar values. It is better to use the lesser known solution 2c / (-b -+ sqrt(b^2 -4ac)) for the other root.

A robust solution can be calculated as:

temp = -0.5 * (b + sign(b) * sqrt(b*b - 4*a*c);
x1 = temp / a;
x2 = c / temp;

The use of sign(b) ensures that we are not subtracting two similar values.

For the OP, modify this for complex numbers as shown by other posters.