Перевод дробных чисел из одной системы счисления в другую
Перевод дробных чисел из одной системы счисления в другую
После того, как я сделал несколько калькуляторов для перевода между разными системами счисления — вот список от первой до последней версии, от самого простого к сложному: Перевод числа в другие системы счисления, Перевод из десятичной системы счисления, Перевод из одной системы счисления в другую — в комментариях стали периодически спрашивать — а что же, мол, дробные числа, как же их переводить? И когда спросили больше трех раз, я таки решил изучить этот вопрос.
Результатом стал калькулятор, который вы видите ниже, он умеет переводить и дробные числа в том числе. Как водится, для любознательных под калькулятором немного теории.
Перевод дробных чисел из одной системы счисления в другую
Теперь теория. Я, честно говоря, думал, что вопрос довольно сложный, но при ближайшем рассмотрении все оказалось проще простого. Надо было только держать в голове тот факт, что речь идет о позиционных системах счисления.
В чем тут суть? Рассмотрим на примере десятичного числа 6.125. Это дробное число в десятичной системе счисления представляется так:
Все просто, не так ли? Та же самая простота сохраняется и при записи дробного числа в любой другой системе счисления. Возьмем, например, горячо любимую каждым программистом двоичную систему и число, например, 110.001. Эта запись есть не что иное как
Да-да, число для примера было выбрано не просто так. То есть, 110.001 в двоичной системе есть 6.125 в десятичной. Принцип, я думаю, ясен.
Есть только одно но — все-таки из-за того, что здесь участвую дроби с разными знаменателями, не всегда одно и тоже число можно одинаково точно выразить в разных системах счисления. Что я имею в виду?
Продолжать можно еще довольно долго, но уже сейчас видно, что 0.8 в десятичной системе это 0.11001100. (дальше очень много цифр) в двоичной. Если честно, то это периодическое число с перидом 1100, так что мы никогда не сможем выразить его точно в двоичной системе счисления. 110011001100. будет продолжаться до бесконечности.
Поэтому перевод дробного числа из одной системы счисления в другую чаще всего дает погрешность. Погрешность эта зависит от того, сколько разрядов мы используем для записи дробной части переведенного числа. Возьмем пример с числом 0.8 и используем для записи его двоичного представления шесть разрядов после запятой — 0.110011. Полученное число вовсе не 0.8, а 0.796875, разница при этом составляет 0.003125. Это и есть наша погрешность перевода десятичного числа 0.8 в двоичный вид при использовании шести разрядов после запятой.
Перевод дробных чисел из десятичной системы счисления в двоичную
Перевод чисел из различных систем счисления в двоичную сводится к их представлению в виде различных комбинаций двух цифровых символов этой системы – 0 и 1. Для перевода из десятичной системы в двоичную чаще всего используется метод последовательного деления на 2, где 2 – это разряд двоичного кода аналогично 10 в десятичном счислении.
Однако этот метод подходит при переводе целых чисел, для дробей же используют, напротив, умножение. А именно умножают дробную часть на 2 последовательно до тех пор, пока не появится целая часть. При этом удачное умножение, дающее в результате число, большее 1, приносит итоговому двоичному числу цифру 1. А неудачное, после которого число все еще меньше 1, дает цифру 0. При этом цифры дроби в двоичном виде записываются после запятой также, как в исходной десятичной.
3Рассмотрим этот немудреный способ на конкретном примере. Для начала возьмите простую десятичную дробь 0,2. Умножайте последовательно на 2:0,2*2 = 0,4 => 0,0_2;0,4*2 = 0,8 => 0,00_2;0,8*2 = 1,6 => 0,001_2;
Отбросьте целую часть и продолжайте те же действия:0,6*2 = 1,2 => 0,0011_2;Снова отбросьте целую часть и вы вернетесь к числу 0,2. Двоичная дробь оказалась цикличной, т.е. повторяющейся, сокращенно запишите:0,2_10 = 0,(0011)_2, где скобки указываются на повторяемость одной и той же группы цифр.
Таким образом,для перевода в двоичную систему дроби с целой частью сначала переводится именно она, а потом уже число после запятой. Например, переведите число 9,25.Для перевода целой части воспользуйтесь методом последовательного деления: 9/2 = 4 и 1 в остатке;4/2 = 2 и 0 в остатке;2/2 = 1 и 0 в остатке;½ = 0 и 1 в остатке. Запишите полученные остатки справа налево: 9_10 = 1001_2.
6Теперь переведите дробную часть:0,25*2 = 0,5 => 0;0,5*2 = 1 => 1.На этот раз вам повезло, дробь оказалась не цикличной. Запишите итог:9,25_10 = 1001,01_2.
Перевод десятичных дробей в двоичную систему счисления заключается в поиске целых частей при умножении на 2. Например, переведём десятичную дробь 0,625 в двоичную систему счисления. Чтобы найти первую после запятой цифру двоичной дроби, нужно умножить заданное число на 2 и выделить целую часть произведения.
0,625 · 2 = 1,250 (целая часть равна 1);
0,250 · 2 = 0,500 (целая часть равна 0);
0,500 · 2 = 1,000 (целая часть равна 1).
Дробная часть последнего произведения равна 0. Перевод закончен. Записываем в одну строку полученное значение целой части, начиная с первой цифры: 0,62510 = 0,1012. Каждый раз в умножении участвует только дробная часть десятичного числа.
Правило перевода: Чтобы перевести положительную десятичную дробь в двоичную, нужно дробь умножить на 2. Целую часть произведения взять в качестве первой цифры после запятой в двоичной дроби, а дробную часть вновь умножить на 2. В качестве следующей цифры взять целую часть этого произведения, а дробную часть произведения снова умножить на 2 и т.д.
При переводе десятичной дроби в двоичную может получиться периодическая дробь.
Пример. Переведем десятичную дробь 0,3 в двоичную систему счисления.
0,3 · 2 = 0,6 (целая часть равна 0);
0,6 · 2 = 1,2 (целая часть равна 1);
0,2 · 2 = 0,4 (целая часть равна 0);
0,4 · 2 = 0,8 (целая часть равна 0);
0,8 · 2 = 1,6 (целая часть равна 1);
0,6 · 2 = 1,2 (целая часть равна 1);
Дробная часть 0,6 уже была на втором шаге вычислений, поэтому вычисления начнут повторяться. Следовательно, в двоичной системе счисления число 0,3 представляется периодической дробью.
Ответ: 0,310 = 0,0(1001)2.
Перевод конечных дробей в позиционных системах счисления
Для перевода правильных дробей из десятичной системы счисления в систему счисления с основанием S нужно умножать исходную дробь последовательно на основание системы счисления S. Полученные в результате умножения целые части произведения являются соответствующими разрядами дробного числа в системе счисления с основанием S.
Перевод правильной конечной р-ичной дроби в десятичную систему счисленияосуществляется аналогично переводу целого числа через развернутую форму представления числа.
Замечание.
При вычислении десятичного значения р-ичной дроби по развернутой форме с использованием калькулятора также целесообразно пользоваться схемой Горнера, что минимизирует количество арифметических действий и исключает возведение в степень.
Алгоритм перевода конечной р-ичной дроби в десятичную СС:
1. Целая часть числа переводится в десятичную систему отдельно от дробной части, согласно правилам перевода.
2. Каждая цифра дробной части р-ичного числа переводится в десятичную систему.
3. Полученные числа нумеруются слева направо, начиная с единицы.
4. Число Р переводится в десятичную систему.
Контрольные вопросы:
1. Что обеспечивает система счисления?
2. Какая система счисления называется позиционной?
3. Какая система счисления называется непозиционной?
4. Какое равенство отожествляется с позиционной системой счисления?
5. Приведите примеры позиционных и непозиционных систем счисления.
6. Какая арифметика называется недесятичной?
7. Как производится сложение, вычитание, умножение, и деление в двоичной системе счисления?
8. Как производится сложение, вычитание, умножение, и деление в восьмеричной системе счисления?
9. Как производится сложение, вычитание, умножение, и деление в шестнадцатеричной системе счисления?
Прямой, дополнительный и обратный коды
Прямой, дополнительный и обратный код числа (создан по запросу).
Далее идет калькулятор, который переводит введенное положительное или отрицательное целое число в двоичный код, а также выводит обратный код этого числа и его дополнительный код. Под калькулятором, как водится, немного теории.
Обновление: Из комментариев становится ясно, что люди не вполне понимают, что делает этот калькулятор. Точнее, что делал — применял алгоритм вычисления дополнительного кода к любому числу. Люди хотят, чтобы он им просто показывал дополнительный код числа. Ну хорошо — теперь при вводе положительного числа калькулятор показывает представление числа в двоичной форме, ибо для него нет обратного и дополнительного кода, а при вводе отрицательного показывает дополнительный и обратный код.
Прямой, дополнительный и обратный код
Прямой код числа это представление беззнакового двоичного числа. Если речь идет о машинной арифметике, то как правило на представление числа отводится определенное ограниченное число разрядов. Диапазон чисел, который можно представить числом разрядов n равен
Обратный код числа, или дополнение до единицы (one’s complement) это инвертирование прямого кода (поэтому его еще называют инверсный код). То есть все нули заменяются на единицы, а единицы на нули.
Дополнительный код числа, или дополнение до двойки (two’s complement) это обратный код, к младшему значащему разряду которого прибавлена единица
А теперь «зачем, зачем это все?» ©
Для различия положительных и отрицательных чисел выделяют старший разряд числа, который называется знаковым (sign bit)
0 в этом разряде говорит нам о том, что это положительное число, а 1 — отрицательное.
С положительными числами все вроде бы понятно, для их представления можно использовать прямой код
0 — 0000
1 — 0001
7 — 0111
А как представить отрицательные числа?
И это оказалось очень удобно для машинных вычислений — при таком представлении отрицательного числа операции сложения и вычитания можно реализовать одной схемой сложения, при этом очень легко определять переполнение результата (когда для представления получившегося числа не хватает разрядности)
Пара примеров
7-3=4
0111 прямой код 7
1101 дополнительный код 3
0100 результат сложения 4
-1+7=6
1111 дополнительный код 1
0111 прямой код 7
0110 результат сложения 6
Что касается переполнения — оно определяется по двум последним переносам, включая перенос за старший разряд. При этом если переносы 11 или 00, то переполнения не было, а если 01 или 10, то было. При этом, если переполнения не было, то выход за разряды можно игнорировать.
Примеры где показаны переносы и пятый разряд
00111 прямой код 7
00001 прямой код 1
01110 переносы
01000 результат 8 — переполнение
Два последних переноса 01 — переполнение
-7+7=0
00111 прямой код 7
01001 дополнительный код 7
11110 переносы
10000 результат 16 — но пятый разряд можно игнорировать, реальный результат 0
Два последних переноса 11 з перенос в пятый разряд можно отбросить, оставшийся результат, ноль, арифметически корректен.
Опять же проверять на переполнение можно простейшей операцией XOR двух бит переносов.
Вот благодаря таким удобным свойствам дополнительный код это самый распространенный способ представления отрицательных чисел в машинной арифметике.