Главная страница
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.049 c
3-1077634767
overword
2004-02-24 17:59
2004.03.28
Непонятки с добавлением Interbase


3-1077704772
ПИТОН
2004-02-25 13:26
2004.03.28
MySQL -> Oracle


4-1074046926
EcoloRa
2004-01-14 05:22
2004.03.28
Работа с заголовком окна


6-1074424836
urez_ua
2004-01-18 14:20
2004.03.28
работа с модемом


7-1072170225
strong
2003-12-23 12:03
2004.03.28
прописать локального администратора