SolveQuadratic Function
Solves a Quadratic Equation of the form AX^2 + BX + C = 0.

Unit
QESBPCSMath

Declaration
Function SolveQuadratic(const A, B, C: Extended; out X1, X2: Extended): Byte;

Description
The function returns the number of roots found, and X1 & X2 are the values.

Parameters
Coefficient of X^2 in the Quadratic Equation.
Coefficient of X in the Quadratic Equation.
Constant in the Quadratic Equation.
X1 First Root of the Quadratic Equation.
X2 Second Root of the Quadratic Equation.

Returns
0 then there are no roots, X1 = X2 = 0. 1 then there is only one root, X1 = X2. 2 then there are two distinct roots X1 <> X2.

Category
Arithmetic Routines for Floats

Implementation

function SolveQuadratic (const A, B, C: Extended; out X1, X2: Extended): Byte;
var
     Det, Q: Extended;
begin
     Det := Sqr (B) - 4 * A * C;
     if FloatIsNegative (Det) then
     begin
          X1 := 0;
          X2 := 0;
          Result := 0;
     end
     else if FloatIsZero (A) then
     begin
          if FloatIsZero (B) then
               raise EMathError.Create (rsNotDefinedForValue);

          X1 := -C / B;
          X2 := X1;
          Result := 1;
     end
     else if FloatIsZero (det) then
     begin
          X1 := -0.5 * B / A;
          X2 := X1;
          Result := 1;
     end
     else
     begin
          Det := Sqrt (Det);
          {: Rather than the "traditional" algebraic solution,
           we use a method that improved accuracy, especially
           when either A or C or both are much closer to zero than B,
           then the discriminant is nearly equal to B and one of the
           calculations will involve the subtraction of two nearly equal
           quantities. Thanks to Rory Daulton for this improvement.
          }
          if B < 0 then
               Q := -0.5 * (B - Det)
          else
               Q := -0.5 * (B + Det);
          X1 := Q / A;
          X2 := C / Q;
          Result := 2;
     end;
End;


HTML generated by Time2HELP
http://www.time2help.com