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

Форум для изучающих FPC и их учителей.

Модератор: Модераторы

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

Сообщение inham130 » 23.11.2011 22:37:17

Код: Выделить всё
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 не решает. Подскажите в чем ошибка.
inham130
незнакомец
 
Сообщения: 1
Зарегистрирован: 23.11.2011 22:32:46

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

Сообщение Alex333 » 24.11.2011 00:44:31

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

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

Сообщение zub » 24.11.2011 01:18:23

zub
долгожитель
 
Сообщения: 2886
Зарегистрирован: 14.11.2005 23:51:26


Вернуться в Обучение Free Pascal

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6

Рейтинг@Mail.ru