Форум: "Основная";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
ВнизКакие-то глюки с округлением чисел Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.009 c