Это очень старый и часто повторяемый топи c. Давайте объясним это еще раз. Вы используете биномиальную теорему, чтобы избежать числовой нестабильности.
В качестве первого root вы выбрали тот, в котором знак -b
и знак перед квадратом root совпадают.
if D>0:
SD = D**0.5;
if b > 0: SD = -SD
x1 = (-b+SD) / (2*a)
Затем для второго root вы используете формулу
(-b-SD) / (2*a)
= (b^2-SD^2) / (2*a*(-b+SD))
= 4*a*c / (2*a*(-b+SD))
= (2*c) / (-b+SD)
, чтобы получить
x2 = (2*c) / (-b+SD)
В других случаях отмены катастрофы c, которых избегают с эта процедура не выполняется.
Это полностью исключает любую числовую нестабильность из-за отмены катастрофы c. Если вы хотите go дальше, вы также можете попытаться избежать потенциального переполнения при вычислении дискриминанта.