Решить квадратные уравнения не так просто, как думает большинство людей.
Стандартная формула для решения a x^2 + b x + c = 0
равна
delta = b^2 - 4 a c
x1 = (-b + sqrt(delta)) / (2 a) (*)
x2 = (-b - sqrt(delta)) / (2 a)
, но когда 4 a c << b^2
, вычисления x1
включаютвычитая близкие числа, вы теряете точность, поэтому вместо этого вы используете
delta as above
x1 = 2 c / (-b - sqrt(delta)) (**)
x2 = 2 c / (-b + sqrt(delta))
, который дает лучшее значение x1, но у которого x2 имеет ту же проблему, что и x1.
Поэтому правильный способ вычисления корней -
q = -0.5 (b + sign(b) sqrt(delta))
и использование x1 = q / a
и x2 = c / q
, что я считаю очень эффективным.Если вы хотите обработать случай, когда delta
отрицателен, или сложные коэффициенты, то вы должны использовать сложную арифметику (что тоже довольно сложно, чтобы получить право).
Редактировать: С кодом Ады:
DELTA := B * B - 4.0 * A * C;
IF(B > 0.0) THEN
Q := -0.5 * (B + SQRT(DELTA));
ELSE
Q := -0.5 * (B - SQRT(DELTA));
END IF;
X1 := Q / A;
X2 := C / Q;