Python

Проблема с кодом на Python

Написал код для решения квадратного уравнения и проверки через теорему Виета. Начал проверять, работает как часы, но под конец спотыкается об строчку и выходит, в большинстве вариантов, в ошибку, т.е. понимает эту строчку не так, как должен. Голову сломал, но не понял, как ее исправить. Код прилагаю ниже и дополнительно отдельно проблемную строчку
 import math 
print ('Введите значения парметров a, b, c \n')

a = float (input('Введите a\n'))
b = float (input('Введите b\n'))
c = float (input('Введите c\n'))

print ('a = ', a); print ('b = ', b); print ('c = ', c)

if (a == 0) and (b == 0) and (c == 0):
print('x - любое');

if (a == 0) and (b == 0) and (c != 0):
print('Нет решений');

if (a == 0) and (b != 0):
x = - (c / b);
print ('x =', (round (x, 2)))

if (a != 0):
d = b**2 - 4*a*c

if (d < 0):
print ('Нет корней');

else:
x1 = (-b - math.sqrt(d))/(2 * a);
x2 = (-b + math.sqrt(d))/(2 * a)

if d >= 0:
print ('Проверка решения по теореме Виета');
if (x1 + x2 == (-b / a)) and (x1 * x2 == (c / a)):
print ('Успешно')
print ('x1 =', (round (x1, 2)), 'x2 =', (round (x2, 2)))
else:
print ('ошибка');
 if (x1 + x2 == (-b / a)) and (x1 * x2 == (c / a)) 
Убрал лишние точки с запятыми, убрал лишнюю проверку дискриминанта:
 if d >= 0: 
т.к. ты уже находишься в ветвлении else после проверки на d < 0, т.е. дискриминант тут точно либо 0, либо больше нуля.
Как уже говорили, нельзя сравнивать числа с плавающей точкой. Тут либо надо использовать класс Decimal, либо самому округлять, либо использовать сравнение разности этих чисел с каким-либо малым числом, так сказать "точностью" вычисления. Итого, как-то так:
 import math  
print ('Введите значения парметров a, b, c \n')

a = float (input('Введите a\n'))
b = float (input('Введите b\n'))
c = float (input('Введите c\n'))

print ('a = ', a); print ('b = ', b); print ('c = ', c)

if (a == 0) and (b == 0) and (c == 0):
print('x - любое')

if (a == 0) and (b == 0) and (c != 0):
print('Нет решений')

if (a == 0) and (b != 0):
x = - (c / b)
print ('x =', (round (x, 2)))

if (a != 0):
d = b**2 - 4*a*c

if (d < 0):
print ('Нет корней')

else:
x1 = (-b - math.sqrt(d))/(2 * a)
x2 = (-b + math.sqrt(d))/(2 * a)
print(round(x1+x2,2), (-b / a))

print ('Проверка решения по теореме Виета')

precision = 10**-6 # точность вычислений

if (x1 + x2 - (-b / a) < precision) and (x1 * x2 - (c / a) < precision):
print ('Успешно')
print ('x1 =', (round (x1, 2)), 'x2 =', (round (x2, 2)))
else:
print ('ошибка')
Александр Хуртин
Александр Хуртин
213
Лучший ответ
Ошибка в том, что вы сравниваете float на равенство после вычислений. Так делать нельзя. Правила приближённых вычислений сейчас не преподают в школах? "Компьютер всё точно и безошибочно посчитает", ага.

Например, попробуйте выполнить такую конструкцию:
 x = 1.1 + 0.1
y = 1.2
print(x == y, x, y)
И это - всего лишь одно сложение. После ваших операций с дискриминантом погрешность накопится гораздо большая. Вам нужно оценить её (правила известны) и перед сравнением округлять числа до тех значащих цифр, которые гарантированно останутся.
В конце if, else, elif всегда должно стоять двоеточие
Александр С
Александр С
5 496