"Информатика (углублённый уровень)", Калинин И.А., Самылкина Н.Н.
Компьютер хранит числа как конечные последовательности битов, поэтому способ записи определяет и допустимые значения, и точность вычислений. Целые числа кодируют в двоичной системе, а отрицательные обычно представляют дополнительным кодом. Для вещественных чисел используют знак, мантиссу и порядок: такая запись охватывает широкий диапазон, но может быть приближённой. Понимание форматов помогает объяснить ошибки округления и переполнения и правильно выбирать тип данных.
Текст подготовлен нейронной сетью по теме параграфа и не заменяет учебник — важные факты и формулировки сверяйте с ним.
Двоичное представление числа — запись числа последовательностью битов, то есть нулей и единиц. В записи без знака все биты кодируют величину, а в записи со знаком часть кодов отводится отрицательным значениям. Различие нужно учитывать, потому что один и тот же набор битов может означать разные числа.
Дополнительный код — способ записать отрицательное целое число так, чтобы его можно было складывать обычным двоичным сумматором. Для получения кода модуля числа инвертируют биты и прибавляют единицу. Этот способ удобен тем, что для сложения положительных и отрицательных чисел не требуется отдельная арифметическая схема.
Формат с плавающей запятой — способ представления вещественного числа через знак, мантиссу и порядок. Мантисса содержит значащие цифры, а порядок определяет положение запятой. Такая запись позволяет хранить числа разных масштабов, например очень большие и очень малые.
Округление заменяет точное значение ближайшим доступным в формате, а переполнение возникает, когда результат выходит за его диапазон. Округление связано с ограниченной точностью мантиссы, переполнение — с ограниченным диапазоном. Различать их нужно, чтобы понимать, почему вычисление может дать неточное значение или не поместиться в выбранный тип.
При фиксированном количестве битов существует конечное число комбинаций: n бит дают 2ⁿ вариантов. Без знака все они представляют неотрицательные числа от 0 до 2ⁿ − 1, потому что ни один код не нужно выделять для знака. В формате со знаком часть комбинаций описывает отрицательные значения, поэтому максимальное положительное число становится меньше. Значит, выбор числа разрядов и наличия знака сразу задаёт границы целых чисел, которые компьютер сможет хранить.
Для отрицательных чисел используют дополнительный код, чтобы сложение выполнялось одним и тем же двоичным устройством независимо от знаков слагаемых. Например, в восьми битах +5 записывается как 00000101. Инвертируем биты и получаем 11111010, затем прибавляем единицу: 11111011 — это −5. При сложении −5 и +3 получаем 11111110, то есть −2; восьмибитная арифметика автоматически отбрасывает перенос за пределы разрядов. Поэтому не нужно отдельно вычитать модули чисел разных знаков.
Вещественное число раскладывают на знак, мантиссу и порядок, чтобы хранить его масштабно: не занимать отдельные разряды для каждой позиции запятой. Например, число можно представить как 1,25 × 10³; в компьютере используется аналогичная идея с основанием 2. Нормализация приводит число к виду, где перед запятой стоит одна значащая цифра, а оставшиеся хранятся в мантиссе. Благодаря этому доступные разряды используются для значащей части числа, а положение запятой задаёт порядок.
Количество разрядов мантиссы определяет, сколько значащих цифр можно сохранить, поэтому именно оно в основном влияет на точность. Диапазон порядка задаёт, насколько большим или малым может быть число: ограниченный порядок не позволяет представить значения за этими границами. Например, десятичная дробь 0,1 не имеет конечной двоичной записи, поэтому её приходится обрезать до доступного количества разрядов и округлить. Даже если значение попадает в диапазон, оно может храниться лишь приближённо.
Вычисления выполняются над уже закодированными значениями, а не над идеальными математическими числами. При промежуточных действиях часть разрядов может отбрасываться, поэтому результат округляется и небольшие погрешности иногда накапливаются. Если целочисленная сумма превысит максимум формата, например 8-битного знакового, возникает переполнение: точный результат 140 не помещается в диапазон от −128 до 127. Поэтому при выборе типа учитывают и возможный размер результата, и требуемую точность.
| Свойство | Целое число | Вещественное число |
|---|---|---|
| Основные части представления | Двоичные разряды; при знаковом формате — код знакового числа | Знак, мантисса и порядок |
| Представление знака | Зависит от формата; обычно применяют дополнительный код | Отдельный разряд знака |
| Диапазон значений | Конечный, определяется количеством битов и наличием знака | Конечный, определяется диапазоном порядка |
| Точность | Все целые в диапазоне представляются точно | Зависит главным образом от длины мантиссы |
| Причины неточного результата | Выход за диапазон и переполнение | Ограниченная мантисса и округление |
| Пример возможной ошибки вычисления | В 8-битном знаковом формате 120 + 20 выходит за максимум 127 | 0,1 + 0,2 может отличаться от точного 0,3 |
Сравнивайте строки таблицы, чтобы понять, подходит ли формат для конкретной задачи. Для целых чисел проверьте, попадают ли все значения в диапазон, а для вещественных — достаточно ли точности мантиссы. Если важны точные десятичные доли, обычный двоичный формат с плавающей запятой может не подойти.
Задача 1. Представить число 13 в двоичной системе и определить, сколько бит требуется для его хранения без знака. Удобно последовательно делить число на 2: остатки дают двоичные разряды, но появляются они в обратном порядке. Затем проверим результат по диапазону беззнакового формата.
Ответ: 13 = 1101₂; без знака достаточно 4 бит. Если формат заранее требует восемь бит, запись будет 00001101, но само число можно закодировать и четырьмя.
Задача 2. Записать −5 в дополнительном коде для восьмиразрядного представления. Сначала кодируем модуль 5, затем инвертируем все разряды и прибавляем единицу. Важно выполнить оба последних действия, иначе получится не дополнительный код.
Ответ: −5 в восьмиразрядном дополнительном коде — 11111011. Проверка сложением с +5 даёт 1 00000000; перенос за восьмой разряд отбрасывается, остаётся 00000000. Это подтверждает, что коды чисел противоположных знаков складываются одной двоичной операцией.
Задача 3. Объяснить, почему 0,1 + 0,2 может отличаться от 0,3, и оценить переполнение целочисленной суммы. Сначала разделим две причины: дробная погрешность связана с мантиссой, а переполнение — с выходом за диапазон. Для проверки возьмём восьмибитный знаковый формат.
Ответ: отличие от 0,3 вызвано приближённым хранением дробей и округлением; сумма 120 + 20 в указанном формате вызывает переполнение. В обоих случаях результат машинного вычисления нельзя автоматически считать точным математическим результатом.
Ошибка 1. Считать, что для дополнительного кода достаточно инвертировать биты. Так думают, потому что инверсия заметно меняет запись, но без прибавления единицы получается другое значение. Проверяйте себя по алгоритму из двух действий: инверсия, затем +1; дополнительно можно сложить код с исходным положительным числом.
Ошибка 2. Принимать конечную двоичную запись за точный способ хранения любого числа. Ограниченное количество битов даёт конечное число кодов, а часть вещественных дробей имеет бесконечную двоичную запись. Уточните формат и проверьте, идёт ли речь о целом числе в диапазоне или о приближённом вещественном значении.
Ошибка 3. Полагать, что увеличение порядка повышает точность. Порядок сдвигает запятую и расширяет доступный масштаб чисел, а точность в основном задаёт количество разрядов мантиссы. Чтобы проверить себя, спросите отдельно: «Насколько большое число поместится?» и «Сколько значащих цифр сохранится?».
Ошибка 4. Игнорировать округление и переполнение, считая результат вычисления точным. Эту ошибку допускают, когда смотрят только на математическую операцию и не учитывают формат хранения. Сравните результат с диапазоном типа и помните, что округление слегка меняет значение, а переполнение означает выход за границу представимых чисел.
Для работы с числами нужны позиционная запись, перевод между двоичной и десятичной системами и понимание разрядов: без них трудно читать машинные коды. Эти знания пригодятся при изучении кодирования данных и устройства компьютера, где биты используются для хранения не только чисел. Понимание точности и диапазона помогает выбирать типы данных и проверять численные алгоритмы. Поэтому тема связывает математическую запись чисел с практикой программирования.
Почему в компьютере нельзя хранить любое целое число?
Для числа выделяют конечное количество битов, а значит, существует конечное количество возможных кодов. Если нужное значение не входит в диапазон выбранного формата, его нельзя точно представить этим форматом.
Как получить дополнительный код отрицательного числа?
Сначала записывают модуль числа в двоичном виде с нужным количеством разрядов. Затем инвертируют все биты и прибавляют единицу; результат ограничивают выбранной разрядностью.
Что означают мантисса и порядок?
Мантисса задаёт значащие цифры числа, а порядок показывает, на сколько позиций нужно сдвинуть запятую. Вместе со знаком они позволяют хранить очень большие и очень малые значения.
Почему 0,1 + 0,2 иногда не равно точно 0,3?
Двоичная запись десятичных дробей 0,1 и 0,2 бесконечна, поэтому компьютер хранит их приближённые значения. При сложении и округлении небольшая погрешность может сохраниться в результате.
Чем переполнение отличается от округления?
При округлении число заменяется ближайшим представимым значением, поэтому результат немного меняется. Переполнение возникает, когда результат выходит за допустимый диапазон формата, и обычным округлением его уже нельзя представить.
§ 20. Представление и обработка чисел