it-swarm-ru.tech

Как конвертировать дробь в двоичную?

1/10(decimal) = 0.0001100110011... (binary)

Как я могу это сделать? Я должен преобразовать в двоичный файл, а затем разделить? Может ли кто-нибудь показать мне?

54
Strawberry

В университете я узнал это так:

  1. Умножить на два
  2. принять десятичную цифру
  3. взять дробь в качестве отправной точки для следующего шага
  4. повторяйте, пока не достигнете 0 или периодического числа
  5. читать число, начинающееся сверху - первый результат - первая цифра после запятой

Пример:

0.1 * 2 = 0.2 -> 0
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
0.2 * 2 = 0.4 -> 0
0.4 * 2 = 0.8 -> 0
0.8 * 2 = 1.6 -> 1
0.6 * 2 = 1.2 -> 1
Result: 0.00011(0011) periodic.
85
Femaref
 1 1 
 - (dec) = ---- (bin) 
 10 1010 
 
 
 0.000110011 .. . 
 ------------- 
 1010 | 1.0000000000 
 1010 
 ------ 
 01100 
 1010 
 ----- 
 0010000 
 1010 
 ----- 
 01100 
 1010 
 ----- 
 0010 
21
irritate

Это может несколько запутать, но десятичные позиции в двоичном коде будут представлять собой взаимные значения степеней двух (например, 1/2, 1/4, 1/8, 1/16 для первого, второго, третьего и четвертого десятичного знака, соответственно) так же, как и в десятичном, десятичные разряды представляют собой взаимные значения последовательных степеней десяти.

Чтобы ответить на ваш вопрос, вам необходимо выяснить, какие взаимные степени двух необходимо добавить, чтобы сложить до 1/10. Например:

1/16 + 1/32 = 0,09375, что довольно близко к 1/10. Добавление 1/64 ставит нас, как и 1/128. Но 1/256 приближает нас еще ближе. Так:

0.00011001 двоичный = 0.09765625 десятичный, что близко к тому, что вы спросили.

Вы можете продолжать добавлять все больше и больше цифр, поэтому ответ будет 0,00011001 ...

15
Michael Goldshteyn

Вот как думать о методе.

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

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

Это, очевидно, обобщает любую базу, а не только 2, как указано GoofyBall .

Еще одна вещь для размышления: если вы округляете до N цифр, остановитесь на N + 1 цифрах. Если цифра # N + 1 равна единице, вам необходимо округлить ее (поскольку двоичные цифры могут быть только 0 или 1, усечение со следующей цифрой 1 столь же неточно, как и усечение 5 в десятичной дроби).

8
PhilipM

Мне понадобилось время, чтобы понять ответ @Femaref (s), поэтому я подумал, что я уточню.

Elboration

Вы хотите преобразовать десятичный 1/10, который равен 0.1, в двоичный файл. Начните с 0.1 в качестве ввода и выполните следующие действия:

  1. Умножьте ввод на 2 (мультиколонка)
  2. Взять десятичную из ответа (столбец ответа) в качестве цифры (двоичный столбец)
  3. Возьмите дробь (столбец дроби) в качестве ввода для следующего шага
  4. Повторите шаги 1, 2 и 3, пока не получите 0 или периодическое число. Начало периодического числа в этом случае показано в последнем столбце, поэтому мы можем на этом остановиться. Но я продолжал показывать повторение для ясности.
  5. Ответ - числа, взятые из двоичного столбца, начинающегося сверху.

В этом случае это:

0.00011(0011) Note: numbers within parenthesis will keep repeating (periodic)

+-------+-------+--------+---------+----------+--------+----------------------+
| input | mult  | answer | decimal | fraction | binary |                      |
+-------+-------+--------+---------+----------+--------+----------------------+
|   0.1 |  2    |    0.2 |    0    |     .2   |      0 |                      |
|   0.2 |  2    |    0.4 |    0    |     .4   |      0 |                      |
|   0.4 |  2    |    0.8 |    0    |     .8   |      0 |                      |
|   0.8 |  2    |    1.6 |    1    |     .6   |      1 |                      |
|   0.6 |  2    |    1.2 |    1    |     .2   |      1 |                      |
|   0.2 |  2    |    0.4 |    0    |     .4   |      0 |                      |
|   0.4 |  2    |    0.8 |    0    |     .8   |      0 |                      |
|   0.8 |  2    |    1.6 |    1    |     .6   |      1 |                      |
|   0.6 |  2    |    1.2 |    1    |     .2   |      1 | < Repeats after this |
|   0.2 |  2    |    0.4 |    0    |     .4   |      0 |                      |
|   0.4 |  2    |    0.8 |    0    |     .8   |      0 |                      |
|   0.8 |  2    |    1.6 |    1    |     .6   |      1 |                      |
|   0.6 |  2    |    1.2 |    1    |     .2   |      1 |                      |
+-------+-------+--------+---------+----------+--------+----------------------+
6
CodingYoshi