Алгоритм перевода следующий. Последовательно умножаем сначала исходное число, затем дробные части получаемых произведений на основание новой системы. При этом целые части получаемых произведений будут являться цифрами записи искомого числа в новой системе (начиная со старшей цифры). Процесс умножения выполняется до получения в дробной части нуля или до получения необходимого количества цифр.
Рассмотрим пример перевода правильной дроби 0,3610 из десятичной системы счисления в двоичную систему с точностью до пяти цифр после запятой. Выполним последовательное умножение:
0 | 36
| × 2
0 | 72
| × 2
1 | 44
| × 2
0 | 88
| × 2
1 | 76
| × 2
1 | 52
…….
Ответ: А2 ≈ 0,010112. Действительно, выполнив перевод полученного результата в десятичную систему, имеем: 0·2–1 + 1·2–2 + 0·2–3 + 1·2–4 + 1·2–5 = = 0,34375.
Получили число, отличающееся от исходного числа 0,3610. Причина расхождения заключается в том, что при переводе было взято пять цифр после запятой. При увеличении количества значащих цифр сумма числового ряда была бы ближе к 0,3610.
|
|
Замечание 1. Следует отметить, что в двоичную систему счисления точно (без ошибки) переводятся только те числа, которые являются конечной суммой степеней числа 2, т. е. целые числа, а также числа 0,5 (2–1); 0,25 (2–2); 0,75 (2–1 + 2–2); 0,125 (2–3); 0,625 (2–1 + 2–3) и т. д. Например, число 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.
1.6.3. Перевод десятичных чисел, содержащих целую и дробную части
Перевод десятичных чисел, содержащих целую и дробную части, из десятичной системы счисления в систему с произвольным основанием р выполняется отдельно для целой и дробной частей числа.