Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Неправильное округление в функции [D5]


Страницы:   1 2

Есипенко ©   (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]

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


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо