Главная страница
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.47 MB
Время: 0.024 c
3-1078156109
td
2004-03-01 18:48
2004.03.28
Неактивный (?) DBGrid (Eh)


14-1078218849
Eugenez
2004-03-02 12:14
2004.03.28
Ищу СD !!!


3-1077875150
wild_arg
2004-02-27 12:45
2004.03.28
Время запроса


14-1078392207
Zendor
2004-03-04 12:23
2004.03.28
update


7-1072975461
Номолос
2004-01-01 19:44
2004.03.28
Как же всё-таки с любых накопителей читать "напрямую"?