Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 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.043 c
4-1074438995
FVova
2004-01-18 18:16
2004.03.28
RegEnumValueW


14-1078045031
Ежик
2004-02-29 11:57
2004.03.28
Эстонская встреча Мастеров


1-1078822648
zamkom
2004-03-09 11:57
2004.03.28
Окончание работы внешней программы.


14-1077706250
Morg
2004-02-25 13:50
2004.03.28
Оптимальный вариант передачи данных


6-1074584487
Winnet
2004-01-20 10:41
2004.03.28
Как же их установить?





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский