![]() |
|
Модераторы: volvo877, Snowy, MetalFan |
![]()
|
|
| term0stat |
|
|||
|
Unregistered |
Помогите сделать программу на Паскале для решения кв. уравнения вида
a*x*x+b*x+c=0 И чтобы если a=0 говорило что это не кв. уравнение и начинало опять требовать ввести значения |
|||
|
||||
| Kesh |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Эксперт Сообщений: 2488 Регистрация: 31.7.2002 Где: Германия, Saarbrü cken Репутация: нет Всего: 54 |
-------------------- ![]() |
|||
|
||||
| Полудненко Олег |
|
|||
|
Українець ![]() ![]() Профиль Группа: Участник... Сообщений: 556 Регистрация: 13.8.2003 Репутация: нет Всего: -11 |
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 |
|
|||
![]() Г-н Посол ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 3668 Регистрация: 13.7.2003 Где: 58°38' с.ш. 4 9°41' в.д. Репутация: нет Всего: 112 |
Пока писал в оффлайне - уже ответили, ну да ладно
-------------------- С уважением, г-н Посол. |
|||
|
||||
| term0stat |
|
|||
|
Unregistered |
Огромное вам спасибо
|
|||
|
||||
| Dr Smth |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 11.10.2004 Где: New Podrezkovo Репутация: нет Всего: 1 |
На этом почему-то все останавливаются, в то время как существуют ещё и комплексные корни... |
|||
|
||||
| Dr Smth |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 100 Регистрация: 11.10.2004 Где: New Podrezkovo Репутация: нет Всего: 1 |
При реализации решения квадратного уравнения можно столкнуться с различного рода неприятностями.
Например: 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 произойдёт любимое всеми нами переполнение. |
|||
|
||||
![]()
|
| Правила форума "Delphi" | |
|
|
Запрещается! 1. Обсуждать и делится взломанными компонентами или программным обеспечением 2. Публиковать ссылки на варез 3. Оффтопить
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, THandle, Rrader, volvo877. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | Object Pascal: кроссплатформенные технологии | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |