Помощь - Поиск - Пользователи - Календарь
Полная версия: квадратное уравнение с некомплексными корнями: не
Форум «Всё о Паскале» > Pascal, Object Pascal > Задачи
koSTIK
Здорово чуваки!
Вобщем такой трабл. Инфа в инсте. Прогу на Паскале надо написать. Корни квадратного уравнения (некомплексные). И вроде всё элементарно:
uses crt;
var
i:integer;
a,b,c,d,x1,x2,p1,p2,t,y,u:real;
r:real;
begin
clrscr;
write('a= ');
read(a);
write('b= ');
read(b);
write('c= ');
read©;
If (a=0) then
begin
If (b=0) then
begin
If (c=0) then
writeln('infinitnoye mnojestvo')
else
writeln('korney net');
end
else begin
x1:=-c/b;
writeln('koren ',x1:4:4);
p1:=a*x1*x1+b*x1 + c;
writeln('proverca: ax1^2+bx1+c= ',p1);
end;
end
else
begin
d:=(sqr(b)-4*a*c);
t:=sqrt(D);
If (d<0) then
writeln('real korney net')
else
begin
writeln;
writeln;
x1:=(- b - t ) / (2*a);
x2:=(- b + t ) / (2*a);
writeln('koren1= ',x1);
writeln('koren2= ',x2);
p1:=a*x1*x1 + b*x1 + c;
writeln('proverca1: ax1^2+bx1+c= ',p1);
p2:=a*x2*x2 + b*x2 + c;
writeln('proverca2: ax2^2+bx2+c= ',p2);
end;
end;
readln;
readln;
end.


<прога одногрупников>
Но препод при*лся. Вводит в качестве b число порядка (10^4)-10^6; вместо с - порядка (10^-4)-(10^-6); ну и а порядка 10^1. В результате конечно при подстановке получившихся корней в исходное уравнение конечно же выражение становится неравным нулю. Ну так вот он заставляет нас посчитать погрешность.

М
Тегами пользуйся ...

volvo
koSTIK, вообще-то сравнивать 2 числа вещественного типа через "=" не принято... Вот эта программа уже не будет вылетать при вводе таких значений, какие ты привел (твоя - вылетала):

{$n+}
uses crt;
const
eps = 10E-9;

var
i:integer;
a,b,c,d,x1,x2,p1,p2,t,y,u:double;
r:real;
begin
clrscr;
write('a= '); readln( a );
write('b= '); readln( b );
write('c= '); readln( c );

if abs(a) < eps then begin
if abs(b) < eps then begin
if abs© < eps then
writeln('infinitnoye mnojestvo')
else
writeln('korney net');
end
else begin
x1:=-c/b;
writeln('koren ',x1:4:4);
p1:=a*x1*x1+b*x1 + c;
writeln('proverca: ax1^2+bx1+c= ',p1);
end;
end
else begin
d:=(sqr(b)-4*a*c);
t:=sqrt(D);
If (d<0) then writeln('real korney net')
else begin
writeln;
writeln;
x1:=(- b - t ) / (2*a);
x2:=(- b + t ) / (2*a);
writeln('koren1= ',x1);
writeln('koren2= ',x2);
p1:=a*x1*x1 + b*x1 + c;
writeln('proverca1: ax1^2+bx1+c= ',p1);
p2:=a*x2*x2 + b*x2 + c;
writeln('proverca2: ax2^2+bx2+c= ',p2);
end;
end;
readln;
readln;
end.


P.S.
Цитата
он заставляет нас посчитать погрешность

Погрешность чего?
koSTIK
Цитата
koSTIK, вообще-то сравнивать 2 числа вещественного типа через "=" не принято...

Не очень-то вас понимаю. Ткните пальцем, пожалуйста.
Цитата
Вот эта программа уже не будет вылетать при вводе таких значений, какие ты привел (твоя - вылетала):

Опять вас не очень-то понимаю. Ну вводим a=12 b=19000 c=0.00056.
При подстановке в исходное уравнение должен получится ноль, однако 1 корень даёт 1.29...E-0009 (в предыдущей проге 5.55...E-0006) второй -1.41...E-0010 (соответственно -6.24...E-0006). Так что хрен редьки не слаще (по крайней мере для меня).
Цитата
Погрешность чего?

Вот этого
Цитата
Ну вводим a=12 b=19000 c=0.00056.
При подстановке в исходное уравнение должен получится ноль, однако 1 корень даёт 1.29...E-0009 (в предыдущей проге 5.55...E-0006) второй -1.41...E-0010 (соответственно -6.24...E-0006).

Я вообще-то не очень понимаю чё он от нас хочет. Но может подскажете как его грузануть по грамотному?
volvo
Цитата(koSTIK @ 1.12.2005 10:21)
Не очень-то вас понимаю. Ткните пальцем, пожалуйста.

Пожалуйста:
Цитата(koSTIK @ 30.11.2005 12:43)
var
...
a,b,c,d,x1,x2,p1,p2,t,y,u:real;
...
If (a=0) then ... { вещественное A? Сравниваем через "="? Некорректно... }
If (b=0) then ... { аналогично }
If (c=0) then ...


Цитата(koSTIK @ 1.12.2005 10:21)
При подстановке в исходное уравнение должен получится ноль, однако 1 корень даёт 1.29...E-0009 (в предыдущей проге 5.55...E-0006) второй -1.41...E-0010 (соответственно -6.24...E-0006).

smile.gif Ну, это смотря как результат вывести... Вот так будет однозначно 0:
      p1:=a*x1*x1 + b*x1 + c;
writeln('proverca1: ax1^2+bx1+c= ',p1:10:7);
p2:=a*x2*x2 + b*x2 + c;
writeln('proverca2: ax2^2+bx2+c= ',p2:10:7);

Кстати, а что такое вещественное число, равное "0"? Это, извините, не перечислимые (целые) типы, когда можно точно сказать: "Если все биты этой переменной типа Integer равны 0, то это - НОЛЬ"... Здесь все по другому. Вещественный ноль - это число, не превосходящее по модулю так называемый "машинный Эпсилон", то есть какую-то определенную величину (и если использовать Extended вместо Double, эта самая величина будет еще меньше...)
Это текстовая версия — только основной контент. Для просмотра полной версии этой страницы, пожалуйста, нажмите сюда.