Преобразование повторяющегося двоичного числа в десятичное (выразить в виде ряда?)

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

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

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

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

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 без особого успеха до сих пор.


person Community    schedule 24.01.2010    source источник


Ответы (4)


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

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

person Rick Regan    schedule 24.01.2010
comment
stackoverflow.com/questions/9254947 / - person Adam; 08.09.2019

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

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

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

который сейчас находится в самых низких условиях. Этот процесс представляет собой дистилляцию полного результата бесконечного геометрического ряда /2127353#2127353">упоминается @Rick Regan.

В двоичном формате мы делаем то же самое, за исключением того, что вместо n 9s в качестве нашего знаменателя мы хотим n 1s (поскольку 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.

person AakashM    schedule 24.01.2010

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

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

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

person zneak    schedule 24.01.2010
comment
Это именно тот подход, который я использовал, хотя мне все еще любопытно, есть ли способ вычислить точное значение. Интуитивно я чувствую, что должен быть в состоянии сделать это с пределом серии в бесконечности, я просто не могу уложиться в голове, чтобы написать это (прошло пару лет с тех пор, как я коснулся такой математики. ..) - person ; 24.01.2010

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

0.196(2) = (196*9 + 2)/(9000)
0.12(034) = (12*999 + 34)/99900

b0.01(011) = (b1*b111 + b11)/b11100 = (1*7 + 3)/(7*4) = 10/28
person smichr    schedule 17.01.2019