Jak przekonwertować ułamek na binarny?
1/10(decimal) = 0.0001100110011... (binary)
5 answers
Na Uniwersytecie nauczyłem się tego w ten sposób:
- mnożenie przez dwa
- Weź dziesiętne jako cyfrę
- Weź ułamek jako punkt wyjścia do następnego kroku
- powtarzaj, dopóki nie osiągniesz 0 LUB LICZBY okresowej
- 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.
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
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...
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).
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:
- mnożenie wejścia przez 2 (kolumna wielotorowa)
- weź dziesiętny z odpowiedzi (kolumna odpowiedzi) jako cyfra (kolumna binarna)
- weź ułamek (kolumnę ułamkową) jako wejście do następnego kroku
- 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.
- 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 | |
+-------+-------+--------+---------+----------+--------+----------------------+
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