| SolveQuadratic Function | 
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 | 
| A | Coefficient of X^2 in the Quadratic Equation. | 
| B | Coefficient of X in the Quadratic Equation. | 
| C | 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 FloatsImplementation
 
| 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; | 
|  |