| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > Object Pascal: кроссплатформенные технологии > Решение квадратного уравнения |
| Автор: term0stat 25.10.2004, 20:35 |
| Помогите сделать программу на Паскале для решения кв. уравнения вида a*x*x+b*x+c=0 И чтобы если a=0 говорило что это не кв. уравнение и начинало опять требовать ввести значения |
| Автор: Kesh 25.10.2004, 20:44 | ||
|
| Автор: Полудненко Олег 25.10.2004, 20:44 |
| begin if a=0 then begin ShowMessage('а не может равняться 0!'); exit; end; D:=sqr(b)-4*a*c; if D<0 then begin ShowMessage('Уравнение не имеет корней!'); exit; end; x1:=(-b+sqrt(D))/(2*a); x2:=(-b-sqrt(D))/(2*a); end. |
| Автор: p0s0l 25.10.2004, 21:38 | ||
Пока писал в оффлайне - уже ответили, ну да ладно
|
| Автор: term0stat 25.10.2004, 21:47 |
| Огромное вам спасибо |
| Автор: Dr Smth 26.10.2004, 10:12 | ||
На этом почему-то все останавливаются, в то время как существуют ещё и комплексные корни... |
| Автор: Dr Smth 27.10.2004, 18:04 | ||
| При реализации решения квадратного уравнения можно столкнуться с различного рода неприятностями. Например: a=1e-200, b=-3e-200, c=2e-200. При вычислении дискриминанта получается машинный нуль, и решение идёт по ветви равных корней: х1=х2=1.5, хотя вполне очевидно, что точные значения равны: х1=1, х2=2. Т.е. определённые комбинации коэффициентов могут заставить программу пойти по ложному следу. В случае, если b*b >> 4*a*c при использовании стандартных формул есть опасность вычитания близких чисел в числителе. Чтобы обойти такую ситуацию применяют, например, выражение для определения х1 с использованием понятия знака числа b: x1=-(b + Sign(b)*Sqrt(d))/(2*a), а второй корень вычисляют с помощью теоремы Виета: x2=c/(a*x1). Ниже помещаю предыдущий код с учётом данной особенности. В нём также вычисляются комплексные корни. В предыдущем коде не была учтена ситуация, когда все коэффициенты равны нулю. В этом случае решением является любое число.
Примечание. При программных расчётах редко получается нуль, так что можно сравнения производить с некоторой малой величиной e. Не ото всех ситуаций удаётся избавиться. Указанной в начале проблемы данный код не решает. Если введём а=1е200, b=-3e200, c=2e-200, то получим нечто похожее, только вместо машинного нуля произойдёт переполнение. Ситуацию, когда a=1e-200, b=1e200, c=-1e200 предложенный код, в принципе, позволяет разрешить, однако при вычислении b*b произойдёт любимое всеми нами переполнение. |