Форум: "Начинающим";
Текущий архив: 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.06 c