Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.01.20;
Скачать: 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 вся ветка

Текущий архив: 2004.01.20;
Скачать: CL | DM;

Наверх




Память: 0.48 MB
Время: 0.028 c
7-63416
Tifon
2003-11-05 14:20
2004.01.20
Подключение сканера!!!


1-63158
Rimd
2004-01-06 16:51
2004.01.20
Rave Report


1-63064
Alex SPA
2004-01-08 10:19
2004.01.20
Открыть файл *.doc (через программу конечно) без предупреждения.


3-63041
gleb
2003-12-22 08:49
2004.01.20
DBGRID


14-63313
SPeller
2003-12-30 09:52
2004.01.20
Новый год - а у нас как в Африке! :-)