Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.01 c
7-63417
Кукарача
2003-11-05 09:10
2004.01.20
файлы и treeview


14-63305
ИЛЮХА
2003-12-22 19:31
2004.01.20
LISTBOX!!! - hhhheeeeeellllppppppp!!!!!!!!!


3-63042
ish
2003-12-24 17:58
2004.01.20
Фильтрация в БД Access


8-63262
WondeRu
2003-09-15 10:08
2004.01.20
Как отключить OpenGL ускорение видеокарты?


6-63271
Samael6
2003-11-13 17:39
2004.01.20
Ядро Internet Explorer





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский