SiMM » Ср июн 01, 2005 4:13 pm
<!--QuoteBegin-Strateg+Jun 1 2005, 17:35--><div class='quotetop'>QUOTE(Strateg @ Jun 1 2005, 17:35)</div><div class='quotemain'><!--QuoteEBegin-->Пока в проге сделал округление, но это извращенческий способ решения проблемы<!--QuoteEnd--></div><!--QuoteEEnd-->Это единственноправильный способ решения проблемы. Разве что тебя не угораздит написать библиотеку, работающую, к примеру, хотя бы с BCD-представлением чисел. Но это извращение.<!--QuoteBegin-Strateg+Jun 1 2005, 17:35--><div class='quotetop'>QUOTE(Strateg @ Jun 1 2005, 17:35)</div><div class='quotemain'><!--QuoteEBegin-->При пошаговой проверке в переменной показывается, что содержится число без этой погрешности.<!--QuoteEnd--></div><!--QuoteEEnd-->Потому что среда, в которой ты выполняешь вывод числа при отладке, выполняет округление ("дружественность", которая тебя подводит).<!--QuoteBegin-Strateg+Jun 1 2005, 17:35--><div class='quotetop'>QUOTE(Strateg @ Jun 1 2005, 17:35)</div><div class='quotemain'><!--QuoteEBegin-->Число, только преобразованное в Real из String я умножаю на 100, потом от него оператором Int беру целую часть и складываю все, потом результат (сумму) делю на 100 и получаю вообще левое число (в десятых единицах разнится с тем, что реально должно получиться.)<!--QuoteEnd--></div><!--QuoteEEnd-->Другой вариант называется "работа с фиксированной запятой", в отличии от "оригинального" варианта - работа с числами с плавающей запятой.<!--QuoteBegin-Strateg+Jun 1 2005, 17:35--><div class='quotetop'>QUOTE(Strateg @ Jun 1 2005, 17:35)</div><div class='quotemain'><!--QuoteEBegin-->Тут-то откуда погрешность???<!--QuoteEnd--></div><!--QuoteEEnd-->Попробуй десятичное число 0.01 перевести в двоичную систему счисления и обратно (деление на 100 это тоже самое, что умножение на 0.01). Будешь поражён. Ещё на первом этапе. Когда попытаешься перевести 0.01 в двоичную. Ибо получишь периодическую дробь. Машина же не умеет хранить периодических дробей. Как и других извратов типа числа Pi или e. Поэтому она хранит их с конечной точностью. Естесственно, после того, как ты попытаешься перевести КОНЕЧНОЕ двоичное число обратно в десятичную систему, ты уже не получишь оригинала. Простой пример, показывающий, что ошибка может возникнуть уже на этапе перевода десятичного, понятного человеку числа, в машинное представление.
А вообще я поражаюсь, господа программисты. Это - азы программирования и машинной арифметики при действиях с числами с плавающей запятой. И их надо бы знать.
IRC: <a href='http://www.fileforum.ru/irc.php' target='_blank'>RUSNET #fileforum</a> (irc.tsk.ru:6669)