Jak przekonwertować ułamek na binarny?

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

Jak to zrobić? Mam konwertować na binarne, a następnie podzielić? Czy ktoś może mi pokazać?
 52
Author: Strawberry, 2011-02-14

5 answers

Na Uniwersytecie nauczyłem się tego w ten sposób:

  1. mnożenie przez dwa
  2. Weź dziesiętne jako cyfrę
  3. Weź ułamek jako punkt wyjścia do następnego kroku
  4. powtarzaj, dopóki nie osiągniesz 0 LUB LICZBY okresowej
  5. odczytaj liczbę zaczynającą się od góry - pierwszym wynikiem jest pierwsza cyfra po przecinku

Przykład:

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.
 84
Author: Femaref,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-13 22:26:38
 1              1
-- (dec)  =   ---- (bin)
10            1010


       0.000110011...
      -------------
1010 | 1.0000000000
         1010
       ------
         01100
          1010
         -----
          0010000
             1010
            -----
             01100
              1010
             -----
              0010
 20
Author: irritate,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-13 22:12:02

Może to być nieco mylące, ale miejsca dziesiętne w układzie binarnym reprezentowałyby wzajemności potęg dwóch (np. 1/2, 1/4, 1/8, 1/16, odpowiednio dla pierwszego, drugiego, trzeciego i czwartego miejsca po przecinku), podobnie jak w układzie dziesiętnym, miejsca dziesiętne reprezentują wzajemności kolejnych potęg dziesięciu.

Aby odpowiedzieć na twoje pytanie, musisz dowiedzieć się, jakie wzajemności potęg dwóch trzeba by dodać do 1/10. Na przykład:

1/16 + 1/32 = 0.09375, które jest blisko 1/10. Dodanie 1/64 daje nam przewagę, podobnie jak 1/128. Ale 1/256 wciąż nas zbliża. Więc:

0.00011001 binarny = 0.09765625 dziesiętny, czyli zbliżony do tego, o co prosiłeś.

Można kontynuować dodawanie coraz więcej cyfr, więc odpowiedź będzie 0.00011001...

 14
Author: Michael Goldshteyn,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-02-13 22:10:10

Oto jak myśleć o metodzie.

Za każdym razem, gdy mnożysz przez 2, przesuwasz binarną reprezentację liczby w lewo o 1 miejsce. Przesunąłeś najwyższą cyfrę po punkcie na miejsce 1s, więc zdejmij tę cyfrę i jest to pierwsza (najwyższa, a więc najbardziej lewa) cyfra twojego ułamka. Zrób to jeszcze raz, a dostaniesz następną cyfrę.

Przekształcenie bazy liczby całkowitej przez dzielenie i wzięcie reszty jako następnej cyfry powoduje przesunięcie liczby do racja. Dlatego otrzymujesz cyfry w odwrotnej kolejności, najpierw najniższe.

To oczywiście uogólnia się do dowolnej bazy, a nie tylko do 2, Jak wskazuje GoofyBall.

Kolejna rzecz do przemyślenia: jeśli zaokrąglasz do N cyfr, zatrzymaj się na N + 1 cyfr. Jeśli cyfra # N + 1 jest jedynką, musisz zaokrąglić (ponieważ cyfry w binarnym mogą być tylko 0 LUB 1, obcinanie następną cyfrą a 1 jest tak niedokładne, jak obcinanie 5 w dziesiętnym).

 7
Author: PhilipM,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:02:49

Zajęło mi trochę czasu zrozumienie odpowiedzi @ Femaref ('s), więc pomyślałem, że rozbuduję.

Elboracja

Chcesz przekonwertować dziesiętne 1/10 które są równe 0.1 na binarne. Zacznij od 0.1 i wykonaj następujące kroki:

  1. mnożenie wejścia przez 2 (kolumna wielotorowa)
  2. weź dziesiętny z odpowiedzi (kolumna odpowiedzi) jako cyfra (kolumna binarna)
  3. weź ułamek (kolumnę ułamkową) jako wejście do następnego kroku
  4. powtórz kroki 1, 2 i 3 dopóki nie osiągniesz 0 LUB LICZBY okresowej. Początek liczby okresowej w tym przypadku jest pokazany w ostatniej kolumnie, więc możemy się tam zatrzymać. Ale nadal pokazywałem powtórzenie dla jasności.
  5. odpowiedzią są liczby pobrane z kolumny binarnej zaczynającej się od góry.

W tym przypadku jest to:

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
Author: CodingYoshi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-13 14:41:32