Главная страница
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.022 c
3-1077856557
RustiK
2004-02-27 07:35
2004.03.28
Create view


14-1077979354
Шишкин Илья
2004-02-28 17:42
2004.03.28
Проблема с железом


1-1078691923
Ton
2004-03-07 23:38
2004.03.28
Расширенный RTF/DOC


1-1079069069
Layner
2004-03-12 08:24
2004.03.28
Мастера, подскажите, как повесить "горячую клавишу" на процедуру.


4-1074011922
Seldon
2004-01-13 19:38
2004.03.28
Доступ к VCL свойствам из другой программы