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

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

Рассмотрим пример перевода правильной дроби 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 (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.

1.6.3. Перевод десятичных чисел, содержащих целую и дробную части

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


Понравилась статья? Добавь ее в закладку (CTRL+D) и не забудь поделиться с друзьями:  



double arrow
Сейчас читают про: