Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глюки при сложении float'ов, 3 вопроса, 3 ответа :) 
:(
    Опции темы
sergejzr
Дата 19.11.2004, 19:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



Вопрос 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
Сергей.


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
podval
Дата 19.11.2004, 22:24 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Где я? Кто я?
****


Профиль
Группа: Экс. модератор
Сообщений: 3094
Регистрация: 25.3.2002
Где: СПб

Репутация: 1
Всего: 62



Тема перенесена из раздела "Алгоритмы".
PM WWW ICQ   Вверх
val
Дата 22.11.2004, 10:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: 1
Всего: 7



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


--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
sergejzr
Дата 22.11.2004, 14:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Un salsero
Group Icon


Профиль
Группа: Админ
Сообщений: 13285
Регистрация: 10.2.2004
Где: Германия г .Ганновер

Репутация: нет
Всего: 360



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

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


--------------------
PM WWW IM ICQ Skype GTalk Jabber AOL YIM MSN   Вверх
val
Дата 22.11.2004, 19:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Program developer
**


Профиль
Группа: Участник Клуба
Сообщений: 992
Регистрация: 14.1.2003
Где: г. Киев

Репутация: 1
Всего: 7



Цитата
Спасибо 


Не за что... smile



--------------------
Терпимость - величайшее благо человечества...
Ярчайший признак интеллекта – постоянно хорошее настроение…
PM MAIL ICQ   Вверх
ТарасАтавин
Дата 30.11.2013, 16:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 370
Регистрация: 26.8.2013

Репутация: нет
Всего: нет



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


--------------------
Не так всё плохо, как оно есть на самом деле.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Форматы файлов и данных | Следующая тема »


 




[ Время генерации скрипта: 0.1095 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.