Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.03.28;
Скачать: CL | DM;

Вниз

непонятное поведение компилятора   Найти похожие ветки 

 
bn2   (2004-03-09 16:56) [0]

Одна и та же функция округления до 1 знака после запятой, но в разных вариантах.
Вариант 1:
function rnd2(f:real):real;
begin
Result:=trunc(f*10+0.5)/10;
end;

Вариант 2:
function rnd2(f:real):real;
begin
f:=(f*10)+0.5;
Result:=trunc(f)/10;
end;

Второй вариант всегда работает правильно, перный иногда ошибается
Основная разница в том, что первый вариант округляет 45,55 как 45,5 (т.е. неправильно), а второй как 45,6.
Вопрос: почему так получается. Логически, код один и тотже. Но в первом случае иногда он работает неправильно. Причину нузно знать обязательно, чтобы в ледующий раз не тратить пару часов на поиск ошибки в 100% правильном коде.


 
Тимохов ©   (2004-03-09 17:07) [1]

Что у вас подразумевается под типом real?
По умолчанию этот тип эквивалетнет double.
Trunc принимает параметер extended.
Т.е. у вас идет работа с разными вещ. типами. Соответственно может возникнуть разное округление.

Очень полезная статься по теме
http://www.delphikingdom.ru/helloworld/reals.htm
Врядли ответит на ваш вопрос, но все же полезно почитать.


 
Тимохов ©   (2004-03-09 17:09) [2]

все из-за того, что в первом случае
45.55 + 0.5 не всегда равно 45.6.
Сам весьма приблизительно помню содержание рекоммендованной мной статьи. Помню только одно - что вещественные типы работают немного по-разному.


 
WebErr ©   (2004-03-09 17:45) [3]


> http://www.delphikingdom.ru/helloworld/reals.htm


> Тимохов ©   (09.03.04 17:07) [1]

Оч. интересная статья.
Половину прочитал сейчас, половину - потом.
Спасибо!
Это, кстати, оч. полезно и для программистов для С++.
Там те же проблемы и то же представление чисел, т.к. процессоры одинаковые и у программистов на Паскале и у программистов на С++!!! :))))


 
bn2   (2004-03-10 18:20) [4]

Дело ж не в типе. И там, и там - trunc(). Но почему через промежуточную переменную работает правильно, а без неё - нет.
Этот альгортм я использую ещё с Basic86. И только сейчас такая вот неприятность вылезла.


 
Тимохов ©   (2004-03-10 18:51) [5]


> bn2   (10.03.04 18:20) [4]

Почти уверен, что в типе.
Было бы время - асм посмотрел, а тек некогда.



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

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

Наверх




Память: 0.48 MB
Время: 0.037 c
3-1077176663
Michail Dalakov
2004-02-19 10:44
2004.03.28
Font в наследниках TControl при Enabled:=false


4-1074500590
acidman
2004-01-19 11:23
2004.03.28
таскание формы без головы


1-1078673204
Алексей
2004-03-07 18:26
2004.03.28
Показ формы при координатах курсора 0;0


7-1073722800
Malwa
2004-01-10 11:20
2004.03.28
Как заменить стандартные часы Windows в системном трее на свои


8-1068816509
Pa5ha
2003-11-14 16:28
2004.03.28
Структура *.3DS файла