Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.02.04;
Скачать: CL | DM;

Вниз

Неправильное округление в функции   Найти похожие ветки 

 
Есипенко ©   (2007-01-15 14:34) [0]

Есть функция Герона

function Geron(ax,ay,bx,by,cx,cy:Real): Real;
var
 a,b,c,p: Real;
begin
 a:=Dlina(ax,ay,bx,by); //=7,07
 b:=Dlina(bx,by,cx,cy); //=7,07
 c:=Dlina(ax,ay,cx,cy); //=10
 p:=(a+b+c)/2;          //=12,07
 Result:=Sqrt(abs(p*(p-a)*(p-b)*(p-c)));
end;

При трассировке
Выражение p*(p-a)*(p-b)*(p-c) равно 625,00
Выражение (p-a)*(p-b)*(p-c) равно 51,75
51,75*12,07=624,6225
Если место р написать 12,07 то результат правильный.
Что это может быть?


 
MBo ©   (2007-01-15 14:43) [1]

Не нужно пользоваться формулой Герона, если известны координаты, считай площадь через векторное произведение.


 
novill ©   (2007-01-15 14:46) [2]

> [1] MBo ©   (15.01.07 14:43)

математику знать - это хорошо...

Я вот не помню как площадь треугольника с помощью векторного произведения посчитать.


 
Есипенко ©   (2007-01-15 14:51) [3]

Использовать формулу Герона необходимо по условию задачи.


 
novill ©   (2007-01-15 14:55) [4]

> [3] Есипенко ©   (15.01.07 14:51)

кинь код функции dlina


 
Сергей М. ©   (2007-01-15 14:56) [5]

Тип Real - тоже по условию задачи ? Или от балды он тобой выбран ?


 
MBo ©   (2007-01-15 14:57) [6]

>novill
1/2*Abs((cx-ax)*(by-ay)-(bx-ax)(cy-ay))


 
MBo ©   (2007-01-15 15:05) [7]

>то результат правильный.
А какой результат правильным считается? ;)


 
Есипенко ©   (2007-01-15 15:08) [8]

>novill

function Dlina(x1,y1,x2,y2:Real): Real;
begin
 Result:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2));
end;


>Сергей М.
А какой тип нужен для дробных чисел?
Проблема в вылазит при умножении на р. Два числа дробные.


 
Сергей М. ©   (2007-01-15 15:11) [9]


> Есипенко ©   (15.01.07 15:08) [8]


Пробуй Double. Еще лучше - Extended, ибо твоя задача не иначе как учебная.


 
Есипенко ©   (2007-01-15 15:17) [10]

Пробовал. Никакой разницы.


 
Сергей М. ©   (2007-01-15 15:18) [11]

тогда см. [4]


 
Elen ©   (2007-01-15 15:19) [12]


> Есипенко

А сама функция Geron правильный результат выдает? с нужной точностью?


 
Есипенко ©   (2007-01-15 15:21) [13]

function Dlina(x1,y1,x2,y2:Real): Real;
begin
Result:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2));
end;


 
Сергей М. ©   (2007-01-15 15:25) [14]

Ты заменил Real на Extended везде где Real встречается в твоей программе ? Или только первый попавшийся ?


 
Есипенко ©   (2007-01-15 15:45) [15]

Везде


 
Сергей М. ©   (2007-01-15 15:48) [16]

Ну тады см.[7]

Тебе задан простой вопрос - что "правильнее",  625,00 или 624,6225 ? И почему ?


 
Есипенко ©   (2007-01-15 16:27) [17]

Можно было бы согласится и на 625,00, но при других входных данных получается по программе 1,96000000Е+0002 а при подсчете на калькуляторе 188,75. И это именно после умножения на р. Выражение (p-a)*(p-b)*(p-c) считается правильно.


 
MBo ©   (2007-01-15 16:30) [18]

приведенные числа позволяют предположить, что считается площадь прямоуг. треугольника с катетами 10*Sqrt(2)/2, а она равна 25


 
Сергей М. ©   (2007-01-15 16:30) [19]


> при подсчете на калькуляторе


На каком ? На котором тётьклава в ларьке выручку считает ?
Или на calc.exe ?


 
ors_archangel ©   (2007-01-15 16:39) [20]

Чему p равно для [17] 1,96000000Е+0002 ?


 
Есипенко ©   (2007-01-15 16:40) [21]

> Сергей М.

На calc.exe с двумя точками после запятой.
А Sitizen SDC-888  и calc.exe при вычислении с двумя разрядами после запятой будут так отличаться?


 
ors_archangel ©   (2007-01-15 16:41) [22]

Вообще, каковы входные параметры? Тестировать нечего!


 
Есипенко ©   (2007-01-15 16:42) [23]

> ors_archangel

p=22.338558425


 
Сергей М. ©   (2007-01-15 16:43) [24]


> Есипенко ©   (15.01.07 16:40) [21]


Что такое "две точки после запятой" в calc.exe ?

Где фигурируют эти самые ""две точки после запятой" в твоей программе, прежде чем сравнивать ее работу с работой calc.exe ?


 
ors_archangel ©   (2007-01-15 16:44) [25]

22.338558425 * ???? =  1,96000000Е+0002
Чему равно ax,ay,bx...... Даёшь все входные параметры Geronа!


 
Есипенко ©   (2007-01-15 16:50) [26]

Входные параметры
0,0 5,5 10,0
0,0 2,3 18,13

Если на калькуляторе 22.338558425 я брал 22.34
Я понимаю, что результаты будут отличаться, но не до такой степени.


 
Плохиш ©   (2007-01-15 16:54) [27]


> Если на калькуляторе 22.338558425 я брал 22.34

Можно дальше не продолжать...


 
Есипенко ©   (2007-01-15 16:56) [28]

Вот код
program LB5_1;
{$APPTYPE CONSOLE}
uses SysUtils;

function Dlina(x1,y1,x2,y2:Extended): Extended;
begin
 Result:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2));
end;

function Geron(ax,ay,bx,by,cx,cy:Extended):Extended;
var
 a,b,c,p: Extended;
begin
 a:=Dlina(ax,ay,bx,by);
 b:=Dlina(bx,by,cx,cy);
 c:=Dlina(ax,ay,cx,cy);
 p:=(a+b+c)/2;
 Result:=Sqrt(abs((p-a)*(p-b)*(p-c)*p));
end;

var
ax,ay,bx,by,cx,cy,Rez:Extended;
begin
   Write("Insert Ax: "); ReadLn(ax);
   Write("Insert Ay: "); ReadLn(ay);
   Write("Insert Bx: "); ReadLn(bx);
   Write("Insert By: "); ReadLn(by);
   Write("Insert Cx: "); ReadLn(cx);
   Write("Insert Cy: "); ReadLn(cy);

   Rez:=Geron(ax,ay,bx,by,cx,cy);
   WriteLn(Rez);
   ReadLn;
end.


Но используя этот код, нужно узнать не только площадь, а еще принадлежит ли точка треугольнику и лежат ли три точки на одной прямой.
А если такое расхождение, то что можно узнать.
Ставил и Single,Real,Double - результат одинаковый.


 
ors_archangel ©   (2007-01-15 16:57) [29]

:)
Ну и какой брать:

 s := Geron(0.0, 5.5, 10.0, 0.0, 2.3, 18.13); // 69.475

или

 s := Geron(0.0, 0.0, 5.5, 2.3, 10.0, 18.13); // 38.3575

или ?


 
Сергей М. ©   (2007-01-15 17:00) [30]


> используя этот код, нужно узнать ..принадлежит ли точка треугольнику


И для этого тоже требуется не иначе как формула Герона, согласно заданию ?!


 
Есипенко ©   (2007-01-15 17:04) [31]

Первый вариант
ax-0
ay-0
bx-5
by-5
cx-10
cy-0
Второй вариант
ax-0
ay-0
bx-2
by-3
cx-18
cy-13

До момента вычиления квадратного корня результат уже неправильный.

> Сергей М.
Да.


 
ors_archangel ©   (2007-01-15 17:04) [32]


> принадлежит ли точка треугольнику

Обычно суммы углов векторов от точки к вершинам, меньшей pi*0.9999 хватало


 
ors_archangel ©   (2007-01-15 17:05) [33]

[32] = [32] * 2


 
Есипенко ©   (2007-01-15 17:14) [34]

В задании сказано используя формулу Герона.


 
ors_archangel ©   (2007-01-15 17:17) [35]


> В задании сказано используя формулу Герона.

В принципе, если площадь треугольника S --> 0, то можно делать вывод, что точки лежат на одной прямой. А как узнать, что точка принадлежит треугольнику? Их всего вроде три? Или я ошибаюсь?


 
Есипенко ©   (2007-01-15 17:25) [36]

> ors_archangel

Есть треугольник ABC и точка X.
1.Найдем площадь треугольника ABC
2.Найдем площади треугольников ABX, BCX и ACX.
3.Сравним. Если площадь треугольника ABC равна сумме площадей ABX, BCX и ACX, значит точка принадлежит треугольнику, иначе - нет


 
ors_archangel ©   (2007-01-15 17:39) [37]

в таком случае правильно считает:
 s := Geron(0, 0, 1, 0, 0, 1); // 0.5
У меня для второго варианта: Geron() = 14, это правильно или совсем нет?


 
Есипенко ©   (2007-01-15 18:10) [38]

Вопрос снят. Всем спасибо.



Страницы: 1 вся ветка

Текущий архив: 2007.02.04;
Скачать: CL | DM;

Наверх




Память: 0.55 MB
Время: 0.031 c
2-1169323277
CaLL|ok
2007-01-20 23:01
2007.02.04
Как правильно оформить цикл?


2-1168979839
SveT
2007-01-16 23:37
2007.02.04
Подстановка значений


6-1157020830
РВА
2006-08-31 14:40
2007.02.04
Добавить клиента


15-1168590761
6548
2007-01-12 11:32
2007.02.04
эмуляция действий


6-1157030488
DelphiLexx
2006-08-31 17:21
2007.02.04
Отправка SMS с помощью INDY