Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Форматы файлов и данных > Глюки при сложении float'ов


Автор: sergejzr 19.11.2004, 19:37
Вопрос 1:
Цитата
Заметил, что часто у программистов возникает один и тот же вопрос.
Почему моя программа иногда неправильно складывает числа с плавающей запятой (float,double).
Стандартный ответ на это:
Посмотри, как такие числа хранятся в памяти компьютера, и всё станет понятно.

Ответ абсолютно верен, но для того, чтобы разобраться человеку потребуется намного больше, чем пара минут.
Так что постараюсь объяснить на пальцах, в надежде, что это подтолкнёт многих посмотреть, как же всё-таки они хранятся smile


Для начала примем во внимание, что память компьютера ограничена, а значит, мы должны с самого начала определить интервал чисел, с которыми будем работать.

Предположим, что у нас 32 бит. Значит, мы можем представить 2^32 различных комбинаций или чисел.
Выбираем интервал от х до х+2^32 и спокойно работаем smile

Теперь берём float. Бит так же, 32, но интервал 32 битного флоата почему-то кажется нам намного больше..
Вопрос 2: Сколько чисел в интервале от 1 до 2?
Ответ 2: Целых чисел там нет.
Зато бесконечное количество дробных.
Вопрос 3: Но ведь мы сказали, что память компьютера ограничена. Каким образом тогда можно представить бесконечное количество? Ведь у нас всего 2^32 комбинаций!
Ответ 3: Конечно никаким!

Теперь понятно, что все дробные числа мы просто не в состоянии представить в нашей "ограниченной" памяти, какой бы интервал мы не взяли. Вот и происходят странные ошибки при сложении. Откуда-то берутся .000000000001 и тому подобное smile грубо говоря, мы можем представить 1423.000000000001, но не можем 1423.

Мы можем аппроксимировать желания юзера smile и распределить имеющиеся 32 бит другим образом.
Здесь вводится понятие "точность". То есть в интервале, например от 0 до 1 компьютер работает точнее, чем в интервале 9999998 до 9999999. Хотя интервал и там 1 и тут 1 smile


А вот теперь пришло время рассмотреть, каким образом удаётся этого добиться.
См:http://sizov.by.ru/pubs/float.shtml

Вопрос 4: А как это лечить?
Ответ 4: К сож. это не лечится.

----------------------------------------------------------
ПС: Прошу, дополнять, исправлять , немного ругать smile
Если посчитаете тему ненужной, я её сотру smile
Сергей.

Автор: podval 19.11.2004, 22:24
Тема перенесена из раздела "Алгоритмы".

Автор: val 22.11.2004, 10:54
Проблема, уважаемые коллеги имеенно в двоичной системе представления чисел. Некоторые конечные дроби в одной системе счисления представляются бесконечными в другой. Вот он, корень зла... smile

Автор: sergejzr 22.11.2004, 14:57
Цитата(val @ 22.11.2004, 09:54)
Проблема, уважаемые коллеги имеенно в двоичной системе представления чисел.

Хорошее дополнение smile
Это тоже один из факторов невозможности точного представления некоторых чисел в компьютерной памяти.
Спасибо smile

Автор: val 22.11.2004, 19:06
Цитата
Спасибо 


Не за что... smile

Автор: ТарасАтавин 30.11.2013, 16:38
Столько текста вместо простого и понятного объяснения, что такое машинный эпсилон, на которое хватило бы и минуты.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)