Страница 1 из 1

Квадратное уравнение

СообщениеДобавлено: 23.11.2011 22:37:17
inham130
Код: Выделить всё
program ddd;
var a,b,c,D,x1,x2:real;
begin
writeln('ўўҐ¤ЁвҐ a b б');
write('a=');
readln(a);
write('b=');
readln(b);
write('c=');
readln(c);
if a=0 then
begin
if b=0 then
if c=0 then writeln('е-«оЎ®Ґ зЁб«®')
else writeln('­Ґв Є®а­Ґ©')
else writeln('x=',-c/b:5:5)
end
else
D:=b*b-4*a*c;
if (D=0)and(a<>0) then writeln('x=',-b/(2*a):5:5)
else
if (D>0) then writeln('x1=',(-b+sqrt(D))/(2*a):5:5,' x2=',
(-b-sqrt(D))/(2*a):5:5)
else writeln('­Ґв Є®а­Ґ©');
readln
end.


Преподаватель требует решить уравнение вида x^2-3.4x+2.89
Программа выдает ответ "нет корней". Если поменять тип данных на extended то это уравнение программа решает, а вот уравнение вида x^2-10.4x+27.04 не решает. Подскажите в чем ошибка.

Re: Квадратное уравнение

СообщениеДобавлено: 24.11.2011 00:44:31
Alex333
Потому что во втором случае d=-1.3877787807814457E-0017, что очень близко к нулю, но ведь не равно ему, а меньше.
А вот почему так... Наверно надо рыть двоичное представление формата Extended, как оно там сделано на уровне бит.
Ну а так, 10 в минус 17-й, это же практически ноль, можно сказать :-)
Ну кстати, если написать Double, то всё нормально - там получается чуть больше нуля (порядка 10 в минус 14-й). Но тоже не ноль :-)
Чудеса... Получается, в таких прогах надо только округлять примерно до 10 в минус 12-й, и будет счастье...
Всё же эти штуки заточены не для математических задач, а для численных методов (а значит не стопроцентно точных).

Re: Квадратное уравнение

СообщениеДобавлено: 24.11.2011 01:18:23
zub