Как компьютер представляет целые и вещественные числа?
Математические числа не ограничены размером, а машинное представление использует фиксированное число бит. Поэтому диапазон конечен, некоторые дроби хранятся приближённо, а…
Математические числа не ограничены размером, а машинное представление использует фиксированное число бит. Поэтому диапазон конечен, некоторые дроби хранятся приближённо, а обычная операция может привести к переполнению. В задаче важно различать математический результат и поведение выбранного формата.
Беззнаковые целые
В 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.
Источники
- МФТИ: Программа вступительного испытания по информатике и информационно-коммуникационным технологиям.
- Поляков К.Ю., Еремин Е.А. Информатика. 11 класс. Углублённый уровень.
- Угринович Н.Д. Информатика. 11 класс. Профильный уровень.