![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Неправильное округление в функции [D5]
Есипенко © (2007-01-15 14:34:00)Есть функция Герона
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 16:30:00) [21]приведенные числа позволяют предположить, что считается площадь прямоуг. треугольника с катетами 10*Sqrt(2)/2, а она равна 25
Есипенко (2007-01-15 16:27:00) [22]Можно было бы согласится и на 625,00, но при других входных данных получается по программе 1,96000000Е+0002 а при подсчете на калькуляторе 188,75. И это именно после умножения на р. Выражение (p-a)*(p-b)*(p-c) считается правильно.
Сергей М. (2007-01-15 15:48:00) [23]Ну тады см.[7]
Тебе задан простой вопрос - что "правильнее", 625,00 или 624,6225 ? И почему ?
Есипенко (2007-01-15 15:45:00) [24]Везде
Сергей М. (2007-01-15 15:25:00) [25]Ты заменил Real на Extended вездегде Real встречается в твоей программе ? Или только первый попавшийся ?
Есипенко (2007-01-15 15:21:00) [26]
function Dlina(x1,y1,x2,y2:Real): Real;
begin
Result:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2));
end;
Elen (2007-01-15 15:19:00) [27]
> Есипенко
А сама функция Geron правильный результат выдает? с нужной точностью?
Сергей М. (2007-01-15 15:18:00) [28]тогда см. [4]
Есипенко (2007-01-15 15:17:00) [29]Пробовал. Никакой разницы.
Сергей М. (2007-01-15 15:11:00) [30]
> Есипенко © (15.01.07 15:08) [8]
Пробуй Double. Еще лучше - Extended, ибо твоя задача не иначе как учебная.
Есипенко (2007-01-15 15:08:00) [31]>novill
function Dlina(x1,y1,x2,y2:Real): Real;
begin
Result:=Sqrt(Sqr(x1-x2)+Sqr(y1-y2));
end;
>Сергей М.
А какой тип нужен для дробных чисел?
Проблема в вылазит при умножении на р. Два числа дробные.
MBo (2007-01-15 15:05:00) [32]>то результат правильный.
А какой результат правильным считается? ;)
MBo (2007-01-15 14:57:00) [33]>novill
1/2*Abs((cx-ax)*(by-ay)-(bx-ax)(cy-ay))
Сергей М. (2007-01-15 14:56:00) [34]Тип Real - тоже по условию задачи ? Или от балды он тобой выбран ?
novill (2007-01-15 14:55:00) [35]> [3] Есипенко © (15.01.07 14:51)
кинь код функции dlina
Есипенко (2007-01-15 14:51:00) [36]Использовать формулу Герона необходимо по условию задачи.
novill (2007-01-15 14:46:00) [37]> [1] MBo © (15.01.07 14:43)
математику знать - это хорошо...
Я вот не помню как площадь треугольника с помощью векторного произведения посчитать.
MBo (2007-01-15 14:43:00) [38]Не нужно пользоваться формулой Герона, если известны координаты, считай площадь через векторное произведение.