Вниз
Скачать: CL | DM;

Какие-то глюки с округлением чисел   Найти похожие ветки 

← →
NailMan ©   (2004-01-08 16:27) [0]

Встретился с сабжем в следующей ситуации:

есть 3 переменные VideoWidth, VideoHeight:Integer и VideoAspect:Single;

VideoAspect принимает значение VideoWidth/VideoHeight

В некоей процедуре есть условие

If VideoAspect>(4/3) then FitToWidth else FitToHeight;

Глюк получается если VideoAspect как раз равен 4/3, тоесть если
VideoWidth:=192(или 512)
VideoHeight:=144(или 384)

По логике вещей при данном значении VideoAspect(192/144) по условию должно сработать FitToHeight, так как эта переменная равна 4/3, но все таки в реалии срабатывает FitToWidth.

Вобщем смотрел в процессе работы проги что находится в переменных перед условием и оказалось, что:
VideoAspect равен 1.3333333741, а отношение (4/3) равно 1.333333333.

Вобщем что это за косяк такой? Получается что если пару чисел, которые в будут давать отношение 4/3 поделить попарно, то один результат из них будет больше другого? Типа переменные в Delphi делятся по другому нежели указанные явно числа?

В чем тут глюк?

ЗЫ:Для правильной работы пришлось условием сделать (4.1/3), что не есть гуд.


← →
Строитель   (2004-01-08 16:32) [1]

см. extended


← →
MBo ©   (2004-01-08 16:33) [2]

http://www.delphikingdom.com/helloworld/reals.htm


← →
NailMan ©   (2004-01-08 16:49) [3]

Агха, спасибо. Вот еэто как раз то что надо.

А есть такая функция, которая округляет число до определенного знака после запятой?


← →
Ega23 ©   (2004-01-08 16:52) [4]

Function Round2(const X:Double):Double;
begin
Result:=Trunc(X*100)/100;
end;

Function Round3(const X:Double):Double;
begin
Result:=Trunc(X*1000)/1000;
end;

Function Round4(const X:Double):Double;
begin
Result:=Trunc(X*10000)/10000;
end;


В общем случае Math придётся цеплять. Хотя может и через логарифмы можно, не проверял.


← →
Тимохов ©   (2004-01-08 16:53) [5]

Ты наверное не совсем внимательно прочел предложенный материал.
Например 0.1 в дес системе точно не представишь в числах с плавующей точкой даже если округлить до 1 знака после запятой. Наверное тебе надо сравнимать с определенным допуском: +- некая дельта.


← →
VMcL ©   (2004-01-08 17:05) [6]

>>NailMan © (08.01.04 16:27)

Лучше проверку переделай так, чтобы использовать только целочисленные операции (по возможности). Например:
VideoAspect (=VideoWidth/VideoHeight) > 4 / 3 с помощью нехитрых алгебраических преобразований можно превратить в вот что:
VideoWidth * 3 > VideoHeight * 4


← →
VMcL ©   (2004-01-08 17:40) [7]

>>Тимохов © (08.01.04 16:53) [5]

Дополнение. Кстати в модуле Math уже есть готовый набор несложных функций CompareValue.


← →
VMcL ©   (2004-01-08 17:44) [8]

А также SameValue.



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

Скачать: CL | DM;



Память: 0.47 MB
Время: 0.026 c
14-63296
MPS
2003-12-30 07:38
2004.01.20
Оптимальная конфигурация Linux


4-63433
Дубинин Алексей
2003-11-13 22:41
2004.01.20
WM_SYSCOMMAND


6-63285
Mag
2003-11-17 19:37
2004.01.20
Отправка содержимого формы по Майлу


11-63050
Radmir
2003-04-04 11:30
2004.01.20
KOL + Indy


1-63129
Андреев
2004-01-06 20:58
2004.01.20
StringGrid




   Наверх