Найти в Дзене
Информатика

Почему 0.1 + 0.2 ≠ 0.3, или Как компьютер считает (и почему иногда врёт)

Окей, представь: ты открываешь калькулятор, вводишь 0.1 + 0.2 и вместо 0.3 получаешь 0.30000000000000004. WTF? 🤯 Нет, это не баг. Это фундаментальное ограничение того, как компьютеры вообще работают с числами. И сегодня мы разберём эту цифровую магию — без формул на весь экран, но с пониманием того, как устроена машина, на которой ты читаешь этот текст прямо сейчас. Ты когда-нибудь видел баг в игре, когда счётчик здоровья вдруг прыгает с 10 HP на 251? Или когда денег в симуляторе становится отрицательное количество? Это не криворукие программисты (ну, не всегда). Это переполнение — момент, когда число становится слишком большим для ячейки памяти и компьютер просто... начинает считать заново. Как старый механический счётчик, который после 999 снова показывает 000. Главный инсайт: Компьютер — это не бесконечная математическая вселенная. Это конечная машина с чёткими ограничениями. И все эти странные баги — просто следствие того, как процессор обрабатывает числа в нулях и единицах. Допус
Оглавление
0.1 + 0.2 ≠ 0.3
0.1 + 0.2 ≠ 0.3

Окей, представь: ты открываешь калькулятор, вводишь 0.1 + 0.2 и вместо 0.3 получаешь 0.30000000000000004. WTF? 🤯

Нет, это не баг. Это фундаментальное ограничение того, как компьютеры вообще работают с числами. И сегодня мы разберём эту цифровую магию — без формул на весь экран, но с пониманием того, как устроена машина, на которой ты читаешь этот текст прямо сейчас.

🎮 Проблема, о которой молчат разработчики игр

Баг с HP в игре
Баг с HP в игре

Ты когда-нибудь видел баг в игре, когда счётчик здоровья вдруг прыгает с 10 HP на 251? Или когда денег в симуляторе становится отрицательное количество?

Это не криворукие программисты (ну, не всегда). Это переполнение — момент, когда число становится слишком большим для ячейки памяти и компьютер просто... начинает считать заново. Как старый механический счётчик, который после 999 снова показывает 000.

Главный инсайт: Компьютер — это не бесконечная математическая вселенная. Это конечная машина с чёткими ограничениями. И все эти странные баги — просто следствие того, как процессор обрабатывает числа в нулях и единицах.

💾 Целые числа: когда один бит решает всё

Допустим, у тебя есть 8 битов памяти — восемь ячеек, в каждой либо 0, либо 1. Это как восемь выключателей: вкл/выкл. Сколько разных чисел можно закодировать?

Ответ: Ровно 256 (от 0 до 255).

Не больше. Физически невозможно. 2⁸ = 256 — и точка.

Но что если нам нужны отрицательные числа? Типа −42 или −1969?

Прямой код: очевидно, но тупо

Самый простой способ: выделить один бит под знак (0 = плюс, 1 = минус), остальные — под саму величину. Логично, да?

Проблема: процессору теперь нужно уметь и складывать, и вычитать. Это усложняет архитектуру. А инженеры любят элегантность.

Дополнительный код: тёмная магия арифметики ✨

магия арифметики
магия арифметики

Представь механический счётчик. Когда крутишь его назад от 000, он показывает 999, 998, 997...

А что если считать 999 кодом числа −1? Тогда:

5 − 2 = 5 + (−2) = 5 + 998 = 1003

Единица переполнения теряется — остаётся 003. Правильный ответ! 🎯

Вот это и есть дополнительный код — способ превратить вычитание в обычное сложение. Процессору не нужны отдельные схемы для вычитания. Просто инвертируешь все биты отрицательного числа, добавляешь 1 — и готово.

Почему это гениально: Одна операция (сложение) вместо двух (сложение + вычитание). Меньше транзисторов, выше скорость, меньше багов.

🌊 Вещественные числа: попытка поймать бесконечность

бесконечность
бесконечность

Теперь сложнее. Как хранить число вроде π (3.14159...) или √2 (1.41421...)?

Математика говорит: между любыми двумя вещественными числами лежит бесконечное множество других чисел. Между 12.34 и 12.35 есть 12.341, 12.3412, 12.34123... и так до бесконечности.

Компьютер с его конечной памятью: «Извини, не могу».

Как это работает: научная нотация

Помнишь из физики скорость света — 3 × 10⁸ м/с? Это экспоненциальная форма:

число = мантисса × основание^порядок
47.8 = 4.78 × 10¹

Компьютер делает так же, только в двоичной системе. Выделяет несколько битов под мантиссу (значащие цифры) и несколько под порядок (степень двойки).

Проблема: Битов ограниченное количество. Для мантиссы, допустим, 23 бита. Это даёт точность примерно до 7 десятичных знаков. Всё, что дальше — округляется.

Вот почему 0.1 + 0.2 ≠ 0.3

Число 0.1 в двоичной системе — это бесконечная дробь (как 1/3 = 0.333... в десятичной). Компьютер обрезает её до 23 битов мантиссы. Потом складывает два неточных числа — и получается 0.30000000000000004.

Практический совет: Никогда, слышишь, никогда не сравнивай вещественные числа на точное равенство в коде. Используй проверку типа |a - b| < 0.0001. Иначе словишь баг, который будет воспроизводиться раз в миллион запусков.

💰 Почему банки не используют float для денег

банки не используют float
банки не используют float

Серьёзно. В финансовых приложениях запрещено использовать обычные вещественные числа (float, double). Почему?

Потому что ошибки округления накапливаются. Сделал миллион транзакций — и вот уже несколько копеек потерялось в цифровой бездне. Или, что хуже, появилось из ниоткуда.

Решение: Хранить деньги в целых числах (в копейках) или использовать специальные библиотеки типа Decimal, которые считают с произвольной точностью (медленнее, но гарантированно).

🎯 Три инсайта, которые стоит запомнить

1. Компьютер — не калькулятор богов. Он работает в конечной разрядной сетке. Бесконечность — не для него.

2. Дополнительный код — это не «странная тема из учебника». Это элегантное инженерное решение, которое упрощает архитектуру процессора и делает твой компьютер быстрее.

3. Ошибки округления — не баг, а фича. Точнее, неизбежное следствие представления непрерывных величин в дискретной машине. Понимание этого отличает кодера от разработчика.

🚀 Зачем это знать?

Когда ты понимаешь, как компьютер работает с числами, ты:

  • Не удивляешься странным багам в играх и приложениях
  • Выбираешь правильные типы данных в коде (int vs float vs double)
  • Не делаешь классических ошибок новичков (сравнение float на равенство, переполнение счётчиков)
  • Начинаешь думать как машина — а это суперсила в мире IT

Это не просто теория из учебника. Это фундамент, на котором стоит весь цифровой мир: от мемов в телеграме до алгоритмов рекомендаций в ютубе, от игровых движков до шифрования твоих сообщений.

💡 Хочешь копнуть глубже? Полный учебный материал с детальными примерами, схемами и крутыми иллюстрациями ждёт тебя на нашем сайте! Там мы разбираем алгоритмы получения дополнительного кода, таблицы диапазонов для разных типов данных, и ещё кучу практических кейсов.

P.S. В следующий раз, когда увидишь странное число в калькуляторе — ты уже будешь знать, что это не баг. Это просто компьютер честно показывает тебе свои ограничения. Уважай машину — она старается 🤖