Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.02.04;
Скачать: [xml.tar.bz2];

Вниз

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

 
Есипенко ©   (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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.53 MB
Время: 0.049 c
2-1169115980
dsa256
2007-01-18 13:26
2007.02.04
Контекстное меню TWebBrowser


2-1168554549
Infinityx93
2007-01-12 01:29
2007.02.04
Динамический массив


2-1169193508
J_SABER
2007-01-19 10:58
2007.02.04
Побитовое считывание файла


9-1142684145
vrem
2006-03-18 15:15
2007.02.04
Rage 3D


1-1165779964
Tack
2006-12-10 22:46
2007.02.04
Неправильная отрисовка фона панели, лежащей в ScrollBox (XP темы)





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский