Какие дробные числа могут быть точно представлены в памяти компьютера в двоичном коде

Обновлено: 15.07.2024

Ей было тысяча сто лет.
Она в сто первый класс ходила,
В портфеле по сто книг носила -
Всё это правда, а не бред.
Когда пыля десятком ног,
Она шагала по дороге,
За ней всегда бежал щенок
С одним хвостом, зато стоногий .
Она ловила каждый звук
Своими десятью ушами,
И десять загорелых рук
Портфель и поводок держали.
И десять тёмно-синих глаз
Рассматривали мир привычно…

Но станет всё совсем обычным,
Когда поймёте наш рассказ.

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

Телеграфист, используя только два символа этой азбуки - точки и тире, может передать практически любой текст.

Объём памяти компьютера измеряется в байтах. Каждый байт может выражать букву, число, пробел, знак препинания или какой-либо другой символ. Количество символов, которые компьютер может хранить в оперативной памяти, меняется в широких пределах от вида компьютера и его модели.

Объём памяти, хотя он и измеряется в байтах, обычно выражается в килобайтах. Слово "килобайт", вообще говоря, означает "1000 байт". (Напомним, что приставка "кило" означает "тысяча".)

Фактически же килобайт равен 1024 байтам: 1 Кбайт = 1024 байт.

Компьютер с объёмом памяти в 64 К может хранить 64 х 1024 = 65536 символов.

Объём памяти первых микрокомпьютеров составлял всего лишь 2 Кб. Нынешние компьютеры имеют объём памяти 128, 256, 512, 1024 Мб и более

Объём памяти новейших компьютеров так велик, что она выражается в гигабайтах, т. е. в миллиардах байтов.

1 Мбайт = 1024 Кбайт = 1 048 576 байт.

Итак, каждый символ алфавитно-цифровой информации представляется в компьютере кодом из восьми двоичных цифр. Следовательно, каждый символ в компьютере имеет код объёмом 1 байт.

имеет в двоичной форме объём 25 байт: 23 буквы и 2 символа "пробел" по 1 байту.

Пример . Измерим в байтах объём текстовой информации в книге из 258 страниц, если на одной странице размещается в среднем 45 строк по 60 символов (включая пробелы). Один символ в двоичной форме содержит 1 байт. Строка будет содержать 61 байт, учитывая и служебный символ окончания строки. Тогда

61 байт * 45 строк = 2745 байт.

Так как в книге 258 страниц текста и на каждой странице в среднем по 2745 байт информации, то объём алфавитно-цифровой информации в книге

2745 байт * 258 страниц = 708210 байт " 692 Кбайт

Таким образом, текст книги имеет объём около 692 Кбайт.

Перевод чисел

Для перевода десятичного числа в двоичное надо разделить его на 2 и собрать остатки, начиная с последнего частного.

А вот как происходит перевод двоичного числа в десятичное:


В любой системе счисления нужно уметь представлять не только целые числа, но и дробные. С математической точки зрения это ординарная задача, которая давно решена. Однако с точки зрения компьютерной техники это далеко не тривиальная проблема, во многом связанная с архитектурой компьютера. Ресурсы компьютеров не бесконечны, и основной трудностью является представление периодических и непериодических дробей. Следовательно, такие дроби следует округлять, задавать класс точности участвующих (и могущих появиться в результате вычислений!) чисел без потери точности вычислений, а также следить за тем, чтобы потеря точности не произошла при переводе чисел из одной системы счисления в другую. Особенно важно аккуратно производить вычисления при операциях с плавающей точкой.

Запишем формулу представления дробного числа в позиционной системе счисления:

Ap = an-1·p n-1 +an-2·p n-2 + . + a1·p 1 +a0·p 0 +a-1·p -1 +a-2·p -2 + . + a-m·p -m ,

В случае десятичной системы счисления получим:

Перевод дробного числа из двоичной системы счисления в десятичную производится по следующей схеме:

101101,1012 = (1·2 5 +0·2 4 +1·2 3 +1·2 2 +0·2 1 +1·2 0 +1·2 -1 +0·2 -2 +1·2 -3 )10=45,62510

Перевод дробного числа из десятичной системы счисления в двоичную осуществляется по следующему алгоритму:

· Вначале переводится целая часть десятичной дроби в двоичную систему счисления;

· Затем дробная часть десятичной дроби умножается на основание двоичной системы счисления;

· В полученном произведении выделяется целая часть, которая принимается в качестве значения первого после запятой разряда числа в двоичной системе счисления;

· Алгоритм завершается, если дробная часть полученного произведения равна нулю или если достигнута требуемая точность вычислений. В противном случае вычисления продолжаются с предыдущего шага.

Пример: Требуется перевести дробное десятичное число 206,116 в дробное двоичное число.

Перевод целой части дает 20610=110011102 по ранее описанным алгоритмам; дробную часть умножаем на основание 2, занося целые части произведения в разряды после запятой искомого дробного двоичного числа:

.116 • 2 = 0 .232

.232 • 2 = 0 .464

.464 • 2 = 0 .928

.928 • 2 = 1 .856

.856 • 2 = 1 .612

.612 • 2 = 1 .224

.224 • 2 = 0 .448

.448 • 2 = 0 .896

.896 • 2 = 1 .792

.792 • 2 = 1 .584

Получим: 206,11610=11001110,00011100112

Таблицу степеней первых восьми отрицательных степеней двойки

Степень основания

Перейдем теперь к вопросу представления отрицательных чисел. Для определенности рассмотрим тип byte , в котором любое число занимает ровно восемь бит . Из записи в двоичной системе счисления равенства (- 1) + 1 = 0 легко найти, какой вид должно иметь неизвестное нам пока двоичное представление xxxxxxxx числа - 1 :

Ясно, что на месте символов xxxxxxxx должно быть расположено число 11111111 . Правильным результатом при этом, конечно, следовало бы считать 100000000 , а не 00000000 , но ведь мы имеем дело с типом byte и, так как результат обязан разместиться в байте, единица <<исчезает>>.

Итак, число - 1 должно кодироваться как 11111111 . Дальнейшее уже совсем просто: для получения - 2 нужно - 1 уменьшить на единицу, что даст 11111110 ; число - 3 представляется как 11111101 и т.д.

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

Легко видеть, что при этом самым маленьким отрицательным числом, которое принадлежит типу byte , является число - 128 (двоичное представление 10000000 ), а самым большим -- число 127 (представление 01111111 ). Все представимыe числа (а их 256) в данном случае могут быть получены как пересечение двух множеств: множества Z всех целых чисел и отрезка [ - 128; 127 ] .

Интересным является следующее наблюдение: если число 01111111 увеличить на единицу, то получится 10000000 , что означает следующее:

Итак, множество элементов типа byte можно представлять себе в виде свернутого в кольцо отрезка
[ - 128; 127 ] .

То, что для элементов множества , являющегося машинным аналогом Z , нарушено фундаментальное свойство целых чисел X + 1 > X , способно привести к различным невероятным на первый взгляд результатам, однако гораздо более странные вещи происходят при работе с вещественными числами.

Двоичная арифметика

Над числами в двоичной системе счисления можно выполнять арифметические действия.

В любой системе счисления нужно уметь представлять не только целые числа, но и дробные. С математической точки зрения это ординарная задача, которая давно решена. Однако с точки зрения компьютерной техники это далеко не тривиальная проблема, во многом связанная с архитектурой компьютера. Ресурсы компьютеров не бесконечны, и основной трудностью является представление периодических и непериодических дробей. Следовательно, такие дроби следует округлять, задавать класс точности участвующих (и могущих появиться в результате вычислений!) чисел без потери точности вычислений, а также следить за тем, чтобы потеря точности не произошла при переводе чисел из одной системы счисления в другую. Особенно важно аккуратно производить вычисления при операциях с плавающей точкой.

Запишем формулу представления дробного числа в позиционной системе счисления:

Ap = an-1·p n-1 +an-2·p n-2 + . + a1·p 1 +a0·p 0 +a-1·p -1 +a-2·p -2 + . + a-m·p -m , [4.1]

В случае десятичной системы счисления получим:

Перевод дробного числа из двоичной системы счисления в десятичную производится по следующей схеме:


101101,1012 = 1·2 5 +0·2 4 +1·2 3 +1·2 2 +0·2 1 +1·2 0 +1·2 -1 +0·2 -2 +1·2 -3 =45,625

Перевод дробного числа из десятичной системы счисления в двоичную осуществляется по следующему алгоритму:

Пример: Требуется перевести дробное десятичное число 206,116 в дробное двоичное число.

Перевод целой части дает 20610=110011102 по ранее описанным алгоритмам; дробную часть умножаем на основание 2, занося целые части произведения в разряды после запятой искомого дробного двоичного числа:


.116 • 2 = 0.232 .232 • 2 = 0.464 .464 • 2 = 0.928 .928 • 2 = 1.856 .856 • 2 = 1.712 .712 • 2 = 1.424 .424 • 2 = 0.848 .848 • 2 = 1.696 .696 • 2 = 1.392 .784 • 2 = 0.784 и т.д.

Получим: 20610=11001110,00011101102

Таблицу степеней первых восьми отрицательных степеней двойки можно посмотреть в Приложении.

Чтобы иметь возможность работать с дробями в двоичной системе счисления, мы применяем позиционную точку, подобную используемой в десятичных дробях. Цифры слева от точки представляют целую часть числа (мантиссу) и обрабатываются точно так, как целые числа, записанные в двоичной системе. Цифры справа представляют дробную часть и обрабатываются аналогично любым другим битам, за исключением того, что их позициям присвоены дробные весовые значения. Это означает, что первая цифровая позиция справа от точки имеет весовое значение 1/2, следующим позициям присваиваются весовые значения 1/4, 1/8 и т.д. Следует отметить, что описанный механизм является простым расширением изложенного выше правила — каждой цифровой позиции присваивается весовое значение в два раза большее, чем последующей в направлении слева на право. Благодаря тому, что позиционным разрядам присваиваются указанные выше весовые значения, процедура расшифровки двоичного представления с точкой, отделяющей дробную часть от целой, аналогична той, которая применяется к целым числам. Значение в каждом разряде просто умножается на весовое значение, присвоенное его позиции в представлении числа, а затем полученные результаты суммируются. Чтобы пояснить эту процедуру нагляднее, на рис. 1.18 показан пример расшифровки двоичного числа 101.101, десятичное представление которого равно 5 5/8.


Рис 1.18 Расшифровка значения двоичного числа 101.101

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

Представление целых чисел

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

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

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

На рис. 1.19 показаны два варианта дополнительного двоичного кода, в кото­рых для представления чисел используются три и четыре бита соответственно. По­строение подобной системы начинается с записи строки нулей, количество кото­рых равно числу используемых двоичных разрядов. Далее ведется обычный дво­ичный отсчет до тех пор, пока не будет получено значение, состоящее из единственного нуля, за которым следуют лишь единицы. Полученные комбинации будут представлять положительные числа 0, 1, 2, 3, . . Для представления отри­цательных чисел выполняется обратный отсчет, начиная со строки из всех единиц соответствующей длины. Обратный счет продолжается до тех пор, пока не будет получена строка, состоящая из одной единицы, за которой будут следовать все ну­ли. Полученные комбинации будут представлять числа -1, -2, -3, . . (Если вам покажется трудным вести обратный отсчет в двоичной системе счисления, можно отсчитывать комбинации в обратном порядке, начиная со строки с одной единицей и всеми нулями и заканчивая строкой, состоящей из одних единиц.)

Обратите внимание, что в дополнительном двоичном коде крайний левый бит в значении каждого числа определяет знак представляемой числовой величины, поэтому этот бит принято называть знаковым разрядом. В этой нотации отрица­тельные числа представляются комбинациями со знаковым битом, равным 1, а положительные числа — комбинациями со знаковым битом, равным 0.

В двоичном дополнительном коде очень удобно представлена взаимосвязь между комбинациями битов, представляющими положительные и отрицатель­ные значения, одинаковые по модулю. Последовательность битов оказывается идентичной при чтении справа налево до первой единицы включительно. С этой позиции и далее коды являются дополнительными друг другу. (Дополнением двоичной комбинации называется такая комбинация, которая получается в ре­зультате изменения всех нулей в исходном значении на единицы, а всех единиц на нули. Например, двоичные комбинации 0110 и 1001 являются дополнитель­ными друг другу.) Например, в четырехразрядном коде (рис. 1.19) обе битовые комбинации, представляющие числа 2 и -2, заканчиваются на 10, однако ком­бинация, представляющая число 2, начинается с 00, тогда как комбинация, представляющая число -2, начинается с 11. Данное наблюдение позволяет сформулировать алгоритм взаимного преобразования битовых комбинаций, представляющих положительные и отрицательные числа, имеющие одно и то же

значение по модулю. Достаточно просто копировать исходную комбинацию спра­ва налево до тех пор, пока не будет встречена единица, а затем последовательно заменять значения оставшихся битов их дополнениями (рис. 1.20).


Рис 1.19 Схемы кодирования в двоичном дополнительном коде

Ясное понимание описанных выше основных свойств двоичного дополни­тельного кода позволяет также сформулировать алгоритм преобразования значений этого кода в десятичное представление. Если битовая комбинация имеет нулевой знаковый бит, то это значение рассматривается просто как обычное двоичное число. Например, битовая комбинация 0110 представляет число 6, поскольку комбинация битов 110 является двоичным представлени­ем числа 6. Если битовая комбинация содержит знаковый бит, равный еди­нице, то она представляет отрицательное число, и нам остается лишь опре­делить абсолютную величину этого числа. Это выполняется посредством за­писи исходной комбинации справа налево, вплоть до первой встретившейся единицы, после чего для оставшихся битов, в порядке их следования, запи­сываются дополнительные значения. Полученная комбинация битов дешиф­руется как обычное двоичное число.

Например, чтобы определить десятичное значение комбинации 1010, мы, прежде всего, отмечаем, что это значение является отрицательным, так как ис­ходная комбинация содержит единицу в знаковом бите. Затем исходная комбинация преобразуется в комбинацию 0110, которая представляет собой двоичное число 6. Теперь можно сделать окончательное заключение, что исходная двоич­ная комбинация представляет число

Представление дробных чисел в двоичной системе счисления

Дробные числа можно записывать не только в виде десятичных дробей, но и в системах счисления с произвольным основанием. Например, при записи дробных чисел в двоичной системе счисления первая цифра после точки (запятой) соответствует значению \(2^\), вторая цифра — значению \(2^\) и т. д. То есть если число в двоичной системе счисления записывается как \(\overlinea_. a_.a_a_. a_>\), то есть имеет \(n\) цифр до точки и \(m\) цифр после точки, то значение такого числа равно \(a_\cdot 2^+a_\cdot 2^+. +a_\cdot 2^+a_\cdot 2^+a_\cdot 2^+. a_\cdot 2^\).

Например, запись \(0.1011_2\) в двоичной системе счисления является представлением числа \(2^+2^+2^\), то есть равно \(\frac\). При этом в виде конечных дробей в двоичной системе счисления можно записать только такие рациональные числа \(\frac\), где знаменатель \(m\) является степенью двойки, другие же рациональные числа представляются в виде бесконечных двоичных дробей.

Например, \(\frac=2^+2^+2^+. =0.010101. _=0.(01)_\), \(\frac=2^+2^+2^+2^+2^+2^+. =0.0001100110011. _2=0.0(0011)_2\). Из-за этого многие рациональные числа (в том числе число \(\frac\)) не могут быть точно представлены в памяти компьютера, поскольку для их точного представления в двоичной системе счисления требуется бесконечной число знаков, так же как и число \(\frac\) не может быть записана в виде десятичной конечной дроби.

Типы данных для представления действительных чисел

Действительные числа в памяти компьютера хранятся в представлении с плавающей точкой: число хранится в виде мантиссы \(b\) и показателя степени \(p\), в этом случае считается, что число равно \(\cdot 2^p\). Аналогичное представление используется при вводе-выводе чисел, при записи действительных чисел в коде программы. Например, значение постоянной Авогадро, равное \(6.02\cdot10^\) в коде программы или при вводе-выводе следует записать как 6.02e23 , где 6.02 — мантиса, 23 — показатель степени, буква «e» при записи действительных чисел в компьютерных программах используется для разделения записи мантисы и показателя.

Но при представлении действительных чисел используется двоичная система счисления, в которой, например, число \(\frac\) в представлении с плавающей точкой можно записать как \(0.010101. \cdot 2^\), или \(0.0010101. \cdot 2^\), или \(0.10101. \cdot 2^\) или еще бесконечно большим числом способов. Желательно выбрать из всех таких представлений одно (каноническое), которое будет называться нормализованным, в этом представлении целая часть числа всегда равна 1 (за исключением числа 0). Для числа \(\frac\) нормализованным представлением будет представление \(1.0101. \cdot 2^\). Поскольку целая часть у нормализованного представления числа всегда (кроме числа 0) равна 1, то целая часть не хранится, а хранится только дробная часть мантиссы. Количество значащих знаков мантисcы, которое хранится, может быть различным для различных способов представления действительных чисел. Например, в типе данных двойной точности, который в языке Python соответствует типу float, в языке C — типу double, в языке Pascal — типу double, хранится 52 бита дробной части мантисы.

Стандарт IEEE754 определяет несколько типов представления действительных чисел, основными из которых являются числа одинарной точности (для их хранения требуется 4 байта), двойной точности (8 байт) и расширенной точности (10 байт).

Дробные числа (в информатике их чаще называют либо действительными, либо вещественными) - это такие числа, в машинном представлении которых может присутствовать дробная часть.

Перевод дробных чисел из двоичной системы в десятичную

Проблемы перевода будем рассматривать только для дробных частей чисел.

Любая двоичная дробь имеет десятичный эквивалент, т. е. точно переводится в десятичную систему.

Действительно, двоичную дробь можно представить в виде:

Здесь ai - одна из цифр двоичной системы (0 или 1).

Приведем сумму к общему знаменателю 2 m и умножим числитель и знаменатель на 5 m . Получим

а это и есть десятичная дробь, поскольку в знаменателе стоит степень десятки.

Перевод дробных чисел из десятичной системы в двоичную

В общем случае десятичная дробь не имеет двоичный эквивалент, т. е. точно не переводится в двоичную систему.

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

Представление дробных чисел в форме с фиксированной запятой

Эта форма предполагает строгую фиксацию запятой в определенном месте разрядной сетки числа.

Недостатком является потребность в большом количестве разрядов как для представления очень больших чисел, так и для представления очень малых чисел. Тем не менее она может найти применение в специализированных ЭВМ, в которых диапазон обрабатываемых чисел ограничен.

Представление дробных чисел в форме с плавающей запятой

Для представления дробных чисел используется так называемая полулогарифмическая форма

q - основание системы счисления;

Например, А=3,1415927. Вот варианты полулогарифмической формы:

и т. д. Видим, что для каждого числа существует бесконечное количество вариантов полулогарифмической формы.

Число называется нормализованным, если

т. е. 1) мантисса по абсолютному значению не превосходит 1 (это второе неравенство);

2) первая цифра мантиссы после запятой не равна нулю (это первое неравенство).

В нашем примере нормализованная форма числа А=0,31415927×10 1 = (1; 0,31425927).

Вот вариант представления нормализованного числа в ЭВМ:


Запятая не фиксирована в определенном месте разрядной сетки, т. е. как бы плавает, отчего такой способ представления получил название "форма с плавающей запятой".

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

Пусть длина числа - 4 байта (32 бита), в том числе:

- порядок со знаком - 8 бит;

- мантисса - 23 бита.

Максимальная мантисса = 2 -1 + 2 -2 + . + 2 -23 = 1- 2 -23 (во всех битах 1, сумма подсчитана по формуле для арифметической прогрессии).

Следовательно, максимальное равно

(1- 2 -23 )´2 127 @ 1,7´10 38 .

Сомневающиеся могут запустить Калькулятор и выполнить вычисления.

Заглянув в справочники, для четырехбайтовых действительных увидим максимальное примерно равно 3,4´10 38 .

Читайте также: