Недавно пришлось столкнуться с дробями в программировании. Казалось бы, банальная операция 0,1 + 0,2 должна давать однозначный ответ. Но, факты поразили: у железного ящика свои понятия о числах. Он выдает удивительные значения.
1. Двойка
Мы с вами привыкли к тому, что пользуемся десятичной системой счисления. Компьютер имеет несколько другие привычки: он орудует единичками и нулями. Проще говоря – ему ближе двоичная система счисления.
Ну и ладно! – скажете вы. – Какая разница?
Отвечаю: результаты арифметических действий у железного товарища могут вас несколько удивить, если вы столкнетесь с вещественными числами.
Лично я никогда не задумывался об этом, пока один знакомый программист не показал интересный пример.
2. Пример
Итак, суть примера представлена на картинке.
Нужно банально сложить 0,1 и 0,2. Каждый школьник моментально скажет ответ: 0,3. И будет прав, если честно. А вот персональный компьютер ведет себя подозрительно.
Вводим те же числа: получаем 0,3. Возникает вопрос: в чем подвох? Результаты же совпали!
Для начала товарищ решил меня спросить, равно ли сложение двух чисел (0,1 + 0,2) тому самому варианту 0,3? Нервы мои начали сдавать: сколько можно издеваться? Конечно, равны!
А теперь спросим у программы: уважаемая софтинка, 0,1 + 0,2 будет ли равно 0,3? И, знаете, что ответил мне железный монстр? Он сказал: НЕТ!
3. Странно всё это
Это как так: 0,3 не равно 0,3? Что за бред!
Тут мы затеяли еще один эксперимент: добавили кучу нулей.
Результат сложения поразил: откуда в самом конце вычисления появилось число 4?
Оказывается, все дело именно в системах счисления. Мне стали объяснять, что ПК работает только со степенями двойки и каждое число пытается представить в таком виде (я ничего не понял, просто кивал).
Именно поэтому, 0,1 + 0,2 не равно 0,3 со 100%-ной точностью. Оно почти равно этому значению…
4. Жизнь
Казалось бы, какое все это имеет отношение к жизни? А вы вспомните о том, что все структуры финансового характера пользуются программами. А те, следовательно, могут творить с числами непонятные вещи.
Предположим, вы положили в банк 17900 руб. под 13 % годовых. Через год вам должны (проверяем на бумажке) уже 20227 руб. Но, товарищ компьютер выдает такое число: 20226.999999999996. Как вы понимаете, доли копеек вам никто давать не будет. Поэтому данная сумма превратится в 20226 руб. 99 копеек.
Оп, 1 копейку своровали, гады. Мелочи? Согласен. Но, операций по стране ежедневно проводится миллионы. А за год сколько наберется?
Вот я и задумался: а в банках, например, как считают? Как надо или как выгодно им? Ответа у меня нет.
Кстати, обычный калькулятор считает правильно.
--
Иногда в жизни сталкиваешься со странными открытиями. И пока космические корабли бороздят околоземную орбиту, на поверхности планеты числа ведут себя очень подозрительно.
Спасибо за внимание. Подписывайтесь