Получить код ссылки
Внешний вид
Пример
РаботаИнженерныеКонвертеры

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

Перевод дробных чисел из одной системы счисления в другую
Timur2010-06-04 19:13:14
После того, как я сделал несколько калькуляторов для перевода между разными системами счисления - вот список от первой до последней версии, от самого простого к сложному: Перевод числа в другие системы счисления, Перевод из десятичной системы счисления, Перевод из одной системы счисления в другую - в комментариях стали периодически спрашивать - а что же, мол, дробные числа, как же их переводить? И когда спросили больше трех раз, я таки решил изучить этот вопрос.

Результатом стал калькулятор, который вы видите ниже, он умеет переводить и дробные числа в том числе. Как водится, для любознательных под калькулятором немного теории.
Перевод дробных чисел из одной системы счисления в другуюCreative Commons Attribution/Share-Alike License 3.0 (Unported)
0.12345678901234567890
 Переведенное число:
 Детали перевода:
 Исходное число в десятичной системе счисления:
 Переведенное число в десятичной системе счисления:
 Погрешность перевода (в десятичном выражении):
 Максимальная погрешность перевода (в десятичном выражении):


Теперь теория. Я, честно говоря, думал, что вопрос довольно сложный, но при ближайшем рассмотрении все оказалось проще простого. Надо было только держать в голове тот факт, что речь идет о позиционных системах счисления.
В чем тут суть? Рассмотрим на примере десятичного числа 6.125. Это дробное число в десятичной системе счисления представляется так:

6.125=6*10^0 + 1*10^{-1}+2*10^{-2}+5*10^{-3}=6*1+\frac{1}{10}+\frac{2}{100}+\frac{5}{1000}

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

110.001=1*2^2 + 1*2^1+0*2^0+0*2^{-1}+0*2^{-2}+1*2^{-3}=1*4+1*2+0*1+\frac{0}{2}+\frac{0}{4}+\frac{1}{8}=6+\frac{1}{8}=6.125

Да-да, число для примера было выбрано не просто так. То есть, 110.001 в двоичной системе есть 6.125 в десятичной. Принцип, я думаю, ясен.

Есть только одно но - все-таки из-за того, что здесь участвую дроби с разными знаменателями, не всегда одно и тоже число можно одинаково точно выразить в разных системах счисления. Что я имею в виду?

Возьмем, например, число 0.8=0+\frac{8}{10}. Отлично смотрится в десятичной системе счисления. Но вот если попробовать получить запись этого числа в двоичной системе счисления - будут проблемы. Попробуем, пока не устанем

0+\frac{1}{2}+\frac{1}{4}+\frac{0}{8}+\frac{0}{16}+\frac{1}{32}+\frac{1}{64}+...=0 + 0.5 + 0.25+0.03125+0.015625+...=0.796875+...

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

Поэтому перевод дробного числа из одной системы счисления в другую чаще всего дает погрешность. Погрешность эта зависит от того, сколько разрядов мы используем для записи дробной части переведенного числа. Возьмем пример с числом 0.8 и используем для записи его двоичного представления шесть разрядов после запятой - 0.110011. Полученное число вовсе не 0.8, а 0.796875, разница при этом составляет 0.003125. Это и есть наша погрешность перевода десятичного числа 0.8 в двоичный вид при использовании шести разрядов после запятой.

Вес крайнего правого разряда (самого младшего разряда) называется разрешением (resolution) или точностью (precision), и определяет наименьшее неравное нулю число, которое может быть представлено данным числом разрядов. Для нашего примера это 2^{-6}=0.015625. При этом максимально возможная погрешность представления числа, как нетрудно сообразить, не превышает половины этого веса, или 0.0078125. Так что для 0.8 мы имеем еще и не самую плохую погрешность.

Вот, собственно, и все.











Комментарии

 Все обсуждения
Защита от спама