Что не так в программе? (Паскаль)

задача алгоритм программа Паскаль

программа для определения, принадлежит ли точка треугольнику. алгоритм таков: вычисляются все 4 площади ("основного" треугольника и трех "маленьких" треугольников, которые получаются, если брать попарно 2 вершини "основного" треугольника и данную точку), потом проверяется, равна ли сумма площадей трех "маленьких" треугольников площади "основного". если да--точка принадлежит.
в чем загвоздка. Паскаль почему-то при суммировании трех "мал." площадей где-то берет какую-то долю (в рамках 0.000000000001). что не так?

вот сама программа:

var xa,ya,xb,yb,xc,yc,xo,yo,ab,bc,ac,ao,bo,co,s_abc,s_aob,s_boc,s_aoc:real;
function len(x1,y1,x2,y2:real):real;
begin
len:=sqrt(sqr(x2-x1)+sqr(y2-y1));
end;
function plowa(a,b,c:real):real;
var p:real;
begin
p:=a+b+c;
p:=p/2;
p:=p*(p-a)*(p-b)*(p-c);
plowa:=sqrt(p);
end;
begin
readln(xo,yo,xa,ya,xb,yb,xc,yc);
ab:=len(xa,ya,xb,yb);
bc:=len(xb,yb,xc,yc);
ac:=len(xa,ya,xc,yc);
ao:=len(xa,ya,xo,yo);
bo:=len(xb,yb,xo,yo);
co:=len(xo,yo,xc,yc);
s_abc:=plowa(ab,ac,bc);
s_aob:=plowa(ab,ao,bo);
s_boc:=plowa(bo,co,bc);
s_aoc:=plowa(ao,co,ac);
if s_aob+s_aoc+s_boc=s_abc then writeln(1)
else writeln(0);
end.

пример: входные данные -- 1 1 -1 0 2 4 4 1
результат -- 0, а должно быть 1.

я проверяла -- дописывала строку writeln(s_aob+s_aoc+s_boc); --программа выводила 8.50000000000001, а должно быть, по идее, 8.5

подскажите, пожалуйста, где тут ошибка?

Примечание:
этот алгоритм тоже имеет право на существование:))
Ответы:
"лежит ли точка в треугольнике" проверяется не так, а путём проверки принадлежности полуплоскостям, получаемым сечением плоскости прямыми, задаваемыми отрезками :)
стоит сравнивать площади с определённой точностью
т.е. конструкцию  if s_aob+s_aoc+s_boc=s_abc then writeln(1) стоит заменить на
if abs((s_aob+s_aoc+s_boc)-s_abc)<e then writeln(1);//где e-точность
Всё правильно, при работе с вещественными числами есть погрешность. Её всегда надо учитывать, сравнивая числа с её учётом. То есть вместо a=b писать abs(a-b)<=eps. Чему должен быть равен эпсилон - точно не скажу, если взять где-то 1e-6, должно работать. А ещё, помнится, в паскале есть тип double, с которым точность будет больше.


14 лет назад

RPI.su - самая большая русскоязычная база вопросов и ответов. Наш проект был реализован как продолжение популярного сервиса otvety.google.ru, который был закрыт и удален 30 апреля 2015 года. Мы решили воскресить полезный сервис Ответы Гугл, чтобы любой человек смог публично узнать ответ на свой вопрос у интернет сообщества.

Все вопросы, добавленные на сайт ответов Google, мы скопировали и сохранили здесь. Имена старых пользователей также отображены в том виде, в котором они существовали ранее. Только нужно заново пройти регистрацию, чтобы иметь возможность задавать вопросы, или отвечать другим.

Чтобы связаться с нами по любому вопросу О САЙТЕ (реклама, сотрудничество, отзыв о сервисе), пишите на почту [email protected]. Только все общие вопросы размещайте на сайте, на них ответ по почте не предоставляется.