2010-01-24 3 views
3

Учитывая двоичное число, которое повторяется, например, 0. (0011) или 0.0 (101), как можно было бы преобразовать его в десятичное?Преобразование повторяющегося двоичного числа в десятичное (выражение в виде серии?)

То, что я был в состоянии выкопать до сих пор является простой метод для преобразования завершающего двоичного числа в десятичной системе, как показано ниже:

res(N+2) = res(N+1)/2 + res(N) 

где Рез результат после стадии N, N- текущая итерация (N = 0; n -> (num двоичные цифры)). Применяя это многократно к неизменяющему двоичному числу, можно получить хорошее приближение, например

dec:0.4 || bin: 0.(0110): 

0 /2 + 0 = 0 
0 /2 + 0 = 0 
0 /2 + 1 = 1 
1/2 /2 + 1 = 3/2 
3/2 /2 + 0 = 3/4 
3/4 /2 + 0 = 3/8 
3/8 /2 + 1 = 19/16 
19/16/2 + 1 = 51/32 
51/32/2 + 0 = 51/64 
51/64/2 + 0 = 51/128 = 0.3984 

, что составляет приблизительно 0,4.

Итак, у меня есть средство вычисления аппроксимаций, но я изо всех сил пытаюсь найти способ выразить это. Я начал пытаться написать его как серию, которую я могу вычислить на пределе, как n-> inf без особого успеха до сих пор.

ответ

1

Одним из способов получения точного ответа является использование бесконечных геометрических рядов. Бесконечная сумма степеней доли г, для экспонентов от 1 до бесконечности, 0 < = r < 1, равна r/(1-r).

В вашем примере 0. (0011), 0.0011 представляет собой долю 3/16. Фактор из 3 и вы получите r = 1/16. r/(1-r) = (1/16)/(15/16) = 1/15. Умножьте, что на 3 вы угадали, и вы получите ответ: 3/15 = 1/5 = 0,2.

1

Даже компьютеры не понимают это совершенно правильно. Обычно значение просто округлое. Если вы начнете отображать значения с плавающей запятой с слишком высокой точностью, вы получите странные значения, например 0,3984 вместо 0,4.

Преобразование любого десятичного числа любой базы в другую базу часто вызывает потерю точности. Вы не можете восстановить это волшебным образом. Это основная причина, по которой вы никогда не должны использовать float или double в программе, которая учитывает важные вещи, такие как деньги.

Просто продолжайте идти, пока не подумайте, что вы достаточно точны и округлите его.

+0

Это именно тот подход, который я принял, хотя мне все еще интересно, есть ли способ вычислить точное значение. Интуитивно я чувствую, что должен быть в состоянии сделать это с пределением серии на бесконечности, я просто не могу понять, как это написано (прошло уже пару лет с тех пор, как я коснулся такой математики. ..) – 2010-01-24 05:55:48

3

Учитывая двоичное число, которое повторяется, например, 0. (0011) или 0.0 (101), как можно было бы преобразовать его в десятичный?

Это можно решить (то есть определить точную рациональную величину) в двоичном формате так же, как в десятичном. В десятичной форме, если у нас есть, скажем, 0.(567), и мы хотим определить точную рациональную величину, которую она представляет, мы просто принимаем 567 как наш числитель и 999 (число, которое имеет n9 s, где n - это количество цифр в повторяющаяся группа) в качестве нашего знаменателя:

0.(567) = 567/999 = 189/333 = 63/111 

, который сейчас находится в наименьших условиях. Этот процесс является дистилляцией результата полной бесконечной геометрической серии mentioned by @Rick Regan.

В двоичных мы делаем то же самое, за исключением того, что вместо n9 с, как нашим знаменателем, мы хотим n1 сек (как 1 самый высокий разряд в двоичном коде).Так, например

0.(0011) = 0011/1111 =(in decimal) 3/15 = 1/5 

Где у вас есть цифры перед повторяющейся группы, просто сделать некоторые арифметические вокруг этого расчета: например, 0.0(101) просто 0.(101) делится на 2. Это последний 101/111 или 5/7, так 0.0(101) является 5/14 ,

Смежные вопросы