Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Методика по Информатике / Теория по информатике / Соколовская Н.Н. Системы счисления.doc
Скачиваний:
81
Добавлен:
10.04.2015
Размер:
247.81 Кб
Скачать

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

1.6.1. Перевод целых десятичных чисел

Алгоритм перевода следующий. Сначала исходное число делится на основание новой системы р, затем получающиеся целые частные снова делятся на р. Действия выполняются в десятичной системе счисления. Деление проводится до получения в частном нуля. Выписываются все остатки, начиная с последнего остатка по первый включительно. Полученное число является записью заданного числа в новой системе.

Рассмотрим пример перевода целого числа 3610 из десятичной системы счисления в двоичную систему. Выполняется последовательное деление:

_ 36 | 2 0

36 _ 18 | 2 0

0 18 _ 9 | 2 0

0 8 _ 4 | 2 0

1 4 _ 2 | 2 0

0 2 _ 1 | 2 0

0 0 0

1

Ответ: А2= 1001002. Действительно, выполнив перевод полученного результата в десятичную систему, имеем: 1·25+ 0·24+ 0·23+1·22+0·21+ 0·20= 36.

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

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

Рассмотрим пример перевода правильной дроби 0,3610 из десятичной системы счисления в двоичную систему с точностью до пяти цифр после запятой. Выполним последовательное умножение:

0 | 36

| × 2

0 | 72

| × 2

1 | 44

| × 2

0 | 88

| × 2

1 | 76

| × 2

1 | 52

…….

Ответ: А2≈ 0,010112. Действительно, выполнив перевод полученного результата в десятичную систему, имеем: 0·21+ 1·22+ 0·23+ 1·24+ 1·25= = 0,34375.

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

Замечание 1. Следует отметить, что в двоичную систему счисления точно (без ошибки) переводятся только те числа, которые являются конечной суммой степеней числа 2, т. е. целые числа, а также числа 0,5 (21); 0,25 (22); 0,75 (21 + 22); 0,125 (23); 0,625 (21 + 23) и т. д. Например, число 0,110 = 0,0(0011)2, оно является бесконечной двоичной дробью с периодом (0011). Под любое число в памяти компьютера отводится заранее известное число битов, поэтому число 0,110 хранится в памяти с ошибкой, это приводит к тому, что если, например, в Basic-программе записан оператор заголовка цикла

for x = 1 to 2 step 0.1,

то предполагается, что переменная х принимает последовательный ряд значений: 1,0; 1,1; 1,2; …; 2,0. На самом деле только начальное значение х точно равно 1,0. Шаг 0,1 в памяти хранится приближенно, поэтому следующее значение х (после начального) уже будет равно не точно 1,1, а приблизительно 1,1. Прибавление приближенного значения шага к приближенному значению х только увеличит эту ошибку, поэтому последнее значение переменной х будет не точно, а приблизительно равно двум. Причем (из-за технической реализации) это значение может быть как немного меньше двух, так и немного больше двух. В первом случае последний раз цикл выполнится при х ≈ 2, так как это значение меньше двух. Во втором случае последний раз цикл выполнится при х ≈ 1,9, так как следующее значение х уже несколько больше двух, а цикл в данном примере должен выполняться при значениях переменной цикла х, не превышающих верхнее значение 2, заданное в заголовке цикла. Для того чтобы не потерять вычисления при последнем значении х ≈ 2, следует заголовок цикла записывать так:

for x = 1 to 2.01 step 0.1.