Как компьютер представляет целые и вещественные числа?

Математические числа не ограничены размером, а машинное представление использует фиксированное число бит. Поэтому диапазон конечен, некоторые дроби хранятся приближённо, а…

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

Беззнаковые целые

В n битах можно записать значения от 0 до 2ⁿ − 1. Сложение на уровне разрядов даёт перенос за пределы сетки; дальнейшее поведение определяет язык и тип. Если задача моделирует арифметику по модулю 2ⁿ, отброшенный перенос является частью правила, а не случайной ошибкой.

Дополнительный код

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

Плавающая точка

Вещественное число хранится через знак, порядок и значащую часть. Ограниченная мантисса означает округление большинства десятичных дробей; например, точное десятичное 0,1 не имеет конечной двоичной записи. Из-за этого прямое сравнение результатов вычислений часто заменяют проверкой допуска.

Переполнение и потеря точности

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

Как рассуждать на экзамене

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

Фиксированная разрядность меняет арифметику

Python хранит целые с расширяемой разрядностью, поэтому переполнение восьмибитного регистра нужно моделировать явно. Маска оставляет младшие биты, а старший бит в дополнительном коде определяет знак. Такая модель позволяет увидеть, почему 127 + 1 превращается в −128 при знаковом восьмибитном сложении.

def signed_byte(value: int) -> int:
    raw = value & 0xFF
    return raw if raw < 0x80 else raw - 0x100

for value in (127, 128, 255, 256, -1):
    print(value, format(value & 0xFF, "08b"), signed_byte(value))

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

Практика: границы двух представлений

Составьте таблицу всех переходов вокруг −128, −1, 0, 127 и 128 для восьми бит. Объясните каждый результат через битовую запись, не ссылаясь только на вывод программы. Затем исследуйте выражение 0.1 + 0.2: выведите его с семнадцатью знаками, сравните с 0.3 точно и через подходящий допуск. В заключении назовите задачу, где нужен целый счётчик минимальных единиц вместо float.

Источники