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