Все разделы
Выбрать школу

Школа. Увлечения. Большое будущее.

PROSCHOOLS · ОБРАЗОВАНИЕ РЯДОМ

Ваш город

Выберите город, чтобы находить образование и возможности рядом.

Как учитываем городКаталог и кнопки «Выбрать школу» покажут школы выбранного города.Онлайн-курсы, учебник, ГДЗ и задания к экзаменам доступны по всей России.

Популярные города

Будет выбран: Вся Россия

Учебные материалы останутся прежними.

Поиск по сайту

По всему сайтуШколы выбранного города — выше в результатах

С чего начнём?

↑ ↓ — выбрать результат · Enter — открыть · Esc — закрыть

Представление чисел в компьютере

💻 Информатика · 10 класс

Целые и вещественные числа, системы счисления.

Клавиатура в компьютерном классе
Клавиатура в компьютерном классеHmartil · Wikimedia Commons · CC BY-SA 4.0

Как компьютер хранит числа

Внутри компьютера нет привычных нам десятичных цифр. Любая информация в нём кодируется последовательностью двух состояний: есть сигнал или нет, заряжена ячейка памяти или разряжена. Эти два состояния обозначают цифрами 0 и 1, а сама запись чисел такими цифрами называется двоичной системой счисления. Один разряд (0 или 1) — это бит, восемь битов образуют байт. Чтобы понять, как машина работает с числами, нужно разобраться в системах счисления и в том, чем отличается хранение целых чисел от вещественных.

Позиционные системы счисления

Система счисления называется позиционной, если значение цифры зависит от её позиции в записи. Привычная нам десятичная система имеет основание 10: число 253 означает 2·100 + 5·10 + 3·1. Точно так же устроены двоичная (основание 2), восьмеричная (8) и шестнадцатеричная (16) системы. В последней не хватает обычных цифр, поэтому к ним добавляют буквы A, B, C, D, E, F для обозначения значений от 10 до 15.

СистемаОснованиеЦифрыГде применяют
Двоичная20, 1внутреннее представление в памяти
Восьмеричная80–7запись прав доступа в системах
Десятичная100–9повседневные вычисления
Шестнадцатеричная160–9, A–Fцвета, адреса памяти

Перевод числа в двоичную систему

Чтобы перевести целое число из десятичной системы в двоичную, его последовательно делят на 2 и записывают остатки снизу вверх.

Переведём 13 в двоичную систему: 13 : 2 = 6, остаток 1 6 : 2 = 3, остаток 0 3 : 2 = 1, остаток 1 1 : 2 = 0, остаток 1 Читаем остатки снизу вверх: 1101 Проверка: 1·8 + 1·4 + 0·2 + 1·1 = 13

Целые и вещественные числа

Целые числа хранятся в памяти точно: каждому отводится фиксированное число байтов. Например, в одном байте (8 битов) помещаются значения от 0 до 255. Чтобы хранить и отрицательные числа, применяют дополнительный код: старший бит становится знаковым, и тогда тот же байт хранит числа от −128 до 127.

Вещественные (дробные) числа хранятся иначе — в формате с плавающей запятой. Число разбивается на знак, мантиссу (значащие цифры) и порядок (степень двойки). Это позволяет хранить очень большие и очень маленькие величины, но почти всегда — приближённо. Именно поэтому компьютер может выдать, что 0.1 + 0.2 не равно ровно 0.3: дробь 0,1 не представляется в двоичной системе конечным числом разрядов.

Частые ошибки. Не путайте бит и байт: 8 битов = 1 байт. При переводе в двоичную систему остатки читают снизу вверх, а не сверху вниз. И помните: вещественные числа в компьютере хранятся приближённо, поэтому сравнивать их на точное равенство опасно.

Как устроен двоичный формат с плавающей точкой

В форматах IEEE 754 binary32 и binary64 биты делятся на знак, поле порядка и поле дроби. Для обычного нормализованного числа значение равно (−1)ˢ·(1 + f/2ᵖ)·2ᴱ⁻ᵇⁱᵃˢ, где f — целое значение поля дроби. Начальная единица хранится неявно.

ФорматВсего битЗнакПорядокПоле дроби pСмещение
binary32321823127
binary6464111521023

Оригинальный разбор числа 6,5

6,5₁₀ = 110,1₂ = 1,101₂·2². Для binary32 знак s = 0; записанный порядок E = 2 + 127 = 129 = 10000001₂; поле дроби начинается с 101, дальше нули до 23 бит. Дробная часть 0,101₂ равна 1/2 + 1/8 = 0,625, поэтому восстановленное число (1 + 0,625)·4 = 6,5. Эта дробь представляется точно.

Что выходит за обычную формулу

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

Проверяем округление на Python

import math
print(0.1 + 0.2 == 0.3)              # False
print(math.isclose(0.1 + 0.2, 0.3))  # True
print(6.5.as_integer_ratio())        # (13, 2)

На обычных платформах Python float использует двоичную двойную точность. Дробь 0,1 имеет бесконечную двоичную запись и округляется; 6,5 имеет конечную запись и хранится точно. Допуски при сравнении выбирают по задаче, особенно рядом с нулём: значение по умолчанию не универсальная мера точности эксперимента.

Целые числа тоже имеют ограничения конкретного представления. Фиксированный знаковый тип ограничен разрядностью; Python int расширяется по мере необходимости в пределах доступной памяти. Нельзя переносить диапазон одного машинного байта на любой целый тип.

Справочные материалы: Как компьютер хранит числа — исходная тема. Связанные уроки: Алгоритмы и их эффективность, Трассировка алгоритма по шагам.

Первоисточники: Oracle: поля IEEE single и double, Python: двоичные дроби и округление.

Кратко о главном

  • Внутри компьютера все числа кодируются двоичной системой из 0 и 1.
  • В позиционной системе значение цифры зависит от её позиции; основание определяет набор цифр.
  • Перевод в двоичную систему — это деление на 2 с чтением остатков снизу вверх.
  • Целые числа хранятся точно, отрицательные — в дополнительном коде.
  • Вещественные числа хранятся с плавающей запятой и почти всегда приближённо.