Wróć   polish:Elite:board > hard- i software > programowanie
programowanie języki, projekty, pomoc, oprócz html, php, js

Odpowiedz
 
LinkBack Narzędzia wątku Przeszukaj ten temat Wygląd

  #1 (permalink)  
Stare 21.10.2009, 22:05
Junior Member
 
Zarejestrowany: Oct 2009
Postów: 2
Postów w giełdzie: 0
Domyślnie Zamiana ułamków dziesiętnych na liczby binarne

Witam, mam do napisania program w C++,który zamienia ułamki dziesiętne w systemie dziesiętnym, na systemy liczbowe( dwujkowe, ósemkowe oraz szesnastkowe).Proszę o pomoc

  #2 (permalink)  
Stare 21.10.2009, 23:20
Senior Member
 
Zarejestrowany: Apr 2007
Skąd: Warszawa, Bytom
Postów: 246
Postów w giełdzie: 0
Domyślnie Odp: Zamiana ułamków dziesiętnych na liczby binarne

Witaj

Zakładam, że z częścią całkowitą sobie poradzisz - teraz pozostaje kwestia części ułamkowej, wbrew pozorom nie jest to takie trudne. Zacznijmy od tego, że każda cyfra ma swoją wagę - jest nią podstawa systemu podniesiona do potęgi równej pozycji cyfry, licząc od cyfry jedności (dodatnie w lewo) - i tak dla systemu dziesiętnego wagi zmieniają się o 10 (cyfra jedności - 1, cyfra dziesiątek - 10, cyfra setek - 100 itp, w drugą stronę - pierwsza cyfra po kropce ma 0.1 (10 ^ -1), druga - 0.01 (10 ^ -2), trzecia - 0.001 (10 ^ -3).
Teraz weźmy system binarny - kolejne wagi, licząc od cyfry jedności w stronę lewą (a więc w kierunku bitów bardziej znaczących) :
1 = 2 ^ 0
2 = 2 ^ 1
4 = 2 ^ 2
8 = 2 ^ 3
itp
Lecąc w kierunku odwrotnym, "na prawo od kropki" - mamy
0.5 = 2 ^ -1
0.25 = 2 ^ -2
0.125 = 2 ^ -4
itp

Algorytm jest prosty (podam tylko dla części ułamkowej) :
1) Na początek:
x = część ułamkowa
n = -1 (pozycja, zaczynamy od -1, pierwsza cyfra po kropce)
2) Sprawdzamy, czy 2 ^ n jest mniejsze niż x:
- jeżeli tak, to nową binarną cyfrą jest jedynka i od x odejmujemy 2 ^ n
- jeżeli nie, to nową binarną cyfrą jest zero, x nie ruszamy
3) Zmniejszamy n o jeden
4) Powtarzamy kroki 2 i 3 aż do osiągnięcia zadanej dokładności

Teraz przykład - załóżmy, że mamy 0.3 rozłożyć na ułamek binarny.
1) Zaczynamy od x = 0.3, n = -1
2A) 2 ^ n = 0.5, 0.5 nie jest mniejsze niż x, mamy pierwszą cyfrę : 0,
nic nie robimy z x-em
3A) Zmniejszamy n, teraz jest równe -2
2B) 2 ^ n = 0.25, czyli mniejsze niż x = 0.3, mamy drugą cyfrę : 1,
zmniejszamy x o 2 ^ n, czyli nowy x = 0.3 - 0.25 = 0.05
3B) Zmniejszamy n, teraz jest równe -3
2C) 2 ^ n = 0.125, nie jest mniejsze niż x, trzecia cyfra to 0, x bez zmian
3C) Zmniejszamy n, teraz jest równe -4
2D) 2 ^ n = 0.0625, nie jest mniejsze niż x, czwarta cyfra to 0, x bez zmian
3D) Zmniejszamy n, teraz jest równe -5
2D) 2 ^ n = 0.03125, jest mniejsze niż x, piąta cyfra to 1,
zmniejszamy x o 2 ^ n, czyli nowy x = 0.05 - 0.03125 = 0.01875
3D) Zmniejszamy n, teraz jest równe -6
....

Podsumowując pięć pierwszych kroków - wyznaczyliśmy pierwsze pięć
cyfr binarnego rozwinięcia (plus cyfra jedności ) - będzie to
0.01001
Możemy sprawdzić sumując wagi, ile wynosi nasze przybliżenie:
0.01001 =
0 * 2 ^ 0 +
0 * 2 ^ -1 +
1 * 2 ^ -2 +
0 * 2 ^ -3 +
0 * 2 ^ -4 +
1 * 2 ^ -5 =

0 * 1 + 0 * 0.5 + 1 * 0.25 + 0 * 0.125 +
0 * 0.0625 + 1 * 0.03125 = 0.25 + 0.03125 = 0.28125
czyli względnie blisko.

Dokładnie tak samo można postąpić dla dowolnego innego systemu
(czy to trójkowy, czy ósemkowy, czy też szesnastkowy) - zmienia się
baza (podstawa potęgi) no i zakres znaków; poza tym wybór nie
ogranicza się w tym momencie do relacji większy / mniejszy,
należy sprawdzić, ILE RAZY waga mieści się w danej cyfrze.

Jedna uwaga - jeżeli ułamek dziesiętny jest skończony to nie znaczy wcale, że odpowiedni ułamek w innej bazie też będzie skończony (np 0.1 ma nieskończone rozwinięcie binarne).

Co do implementacji - zamiast pamiętać pozycję i co krok obliczać 2 ^ n, można po prostu pamiętać wagę pozycji i po każdym kroku dzielić ją przez podstawę - np u nas zaczynamy z wagą 0.5, w nast. kroku jest 0.25, potem 0.125 itp. - dużo prościej i szybciej, niż liczenie 2 ^ n dla ujemnego n (w obliczeniach na górze stosowałem potęgi, żeby łatwiej było wyjaśnić).

W razie pytań - pisz

Pozdrawiam i powodzenia !!

PS D

  #3 (permalink)  
Stare 22.10.2009, 11:03
Senior Member
 
Zarejestrowany: Apr 2006
Postów: 1 549
Postów w giełdzie: 0
Domyślnie Odp: Zamiana ułamków dziesiętnych na liczby binarne

po co sie tak męczyc? prostszy wyglada tak (pseudokod):
float ulamek, int cyfra, podstawa
loop{
ulamek = ulamek * podstawa;
cyfra = int(ulamek);
ulamek = ulamek - cyfra;
print(cyfra);
}
gdzie: ulamek - czesc ulamkowa liczby ktora chcemy zamienic, cyfra - cyfra na danym miejscu szukanej liczby, podstawa - podstawa systemu liczbowego do ktorego dokonujemy konwersji

oczywiscie trzeba zadbac o warunek zakonczenia bo liczba w jednym systemie liczbowym moze miec nieskonczone rozwiniecie w innym.

  #4 (permalink)  
Stare 22.10.2009, 12:01
Senior Member
 
Zarejestrowany: Apr 2007
Skąd: Warszawa, Bytom
Postów: 246
Postów w giełdzie: 0
Domyślnie Odp: Zamiana ułamków dziesiętnych na liczby binarne

Hej
Co racja, to racja - chociaż algorytmy w sumie równoważne sobie, jakby na to nie spojrzeć

Dzięki i pozdrawiam !

  #5 (permalink)  
Stare 22.10.2009, 15:41
Junior Member
 
Zarejestrowany: Oct 2009
Postów: 2
Postów w giełdzie: 0
Domyślnie Odp: Zamiana ułamków dziesiętnych na liczby binarne

Cytat:
Napisał Prusi Zobacz post
po co sie tak męczyc? prostszy wyglada tak (pseudokod):
float ulamek, int cyfra, podstawa
loop{
ulamek = ulamek * podstawa;
cyfra = int(ulamek);
ulamek = ulamek - cyfra;
print(cyfra);
}
gdzie: ulamek - czesc ulamkowa liczby ktora chcemy zamienic, cyfra - cyfra na danym miejscu szukanej liczby, podstawa - podstawa systemu liczbowego do ktorego dokonujemy konwersji

oczywiscie trzeba zadbac o warunek zakonczenia bo liczba w jednym systemie liczbowym moze miec nieskonczone rozwiniecie w innym.
No tak, ale możesz napisać mi cały kod , jakby to wyglądało w c++ ,jestem początkujacy

  #6 (permalink)  
Stare 15.12.2009, 15:12
Junior Member
 
Zarejestrowany: Jun 2007
Postów: 4
Postów w giełdzie: 0
Domyślnie

Podczepiam sie pod temat, zeby nowego watku nie zakladac. Po krotce chcialem sie dowiedziec co nieco o zamianie ulamkow dziesietnych na kod binarny. Wygooglowalem tylko jeden przyklad, ale nie do konca czaje o co chodzi.
przyklad jaki znalazlem:

0,625 na binarny:

dzialanie_______iloczyn_____czesc ulamkowa______czesc calkowita
0,625*2 >>>>>> 1,25 >>>>>>>> 0,25 >>>>>>>>>>>> 1
0,25*2 >>>>>>> 0,5 >>>>>>>>> 0,5 >>>>>>>>>>>>> 0
0,5*2 >>>>>>>> 1 >>>>>>>>>> 0 >>>>>>>>>>>>>> 1

czyli np: 0,789 na binarny to bedzie:

dzialanie________iloczyn____czesc ulamkowa_____czesc calkowita
0,789*2 >>>>>> 1,578 >>>>>> 0,578 >>>>>>>>>>>> 1
0,578*2 >>>>>> 1,156 >>>>>> 0,156 >>>>>>>>>>>> 1
0,156*2 >>>>>> 0,312 >>>>>> 0,312 >>>>>>>>>>>> 0
0,312*2 >>>>>> 0,614 >>>>>> 0,614 >>>>>>>>>>>> 0
0,614*2 >>>>>> 1,248 >>>>>> 0,248 >>>>>>>>>>>> 0
0,248*2 >>>>>> 0,496 >>>>>> 0,496 >>>>>>>>>>>> 0
0,496*2 >>>>>> 0,992 >>>>>> 0,992 >>>>>>>>>>>> 0

i tak mam dalej liczyc az czesc ulamkowa i calkowita bedzie 0 ??

  #7 (permalink)  
Stare 15.12.2009, 17:16
Junior Member
 
Zarejestrowany: May 2008
Postów: 104
Postów w giełdzie: 0
Domyślnie Odp: Zamiana ułamków dziesiętnych na liczby binarne

Tak, ale znalezienie dokładnego rozwinięcia binarnego nie zdarza się tak często, dlatego lepiej jest liczyć z jakąś dokładnością (np. do 20 iteracji).
__________________
Programy w Delphi / Pascal, C/C++ , VB na zlecenie, możliwość wyjaśnienia zasad działania dowolnego kodu, pomoc w formie konsultacji przy pisaniu prac zaliczeniowych. Kontakt: PW - zapraszam

  #8 (permalink)  
Stare 16.12.2009, 12:46
Junior Member
 
Zarejestrowany: Jun 2007
Postów: 4
Postów w giełdzie: 0
Domyślnie Odp: Zamiana ułamków dziesiętnych na liczby binarne

ok, a liczba calkowita z ulamkiem dziesietnym, np 2,25 to bedzie 2 binarnie przed przecinkiem i 0,25 binarnie po przecinku? Tzn:

dzialanie________iloczyn____czesc ulamkowa_____czesc calkowita
0,25*2 >>>>>> 0,5 >>>>>> 0,5 >>>>>>>>>>>> 0
0,5*2 >>>>>> 1 >>>>>> 0 >>>>>>>>>>>> 1
0,*2 >>>>>> 0 >>>>>> 0 >>>>>>>>>>>> 0

2,25 w binarnym to bedzie: 10,010 ??
Odpowiedz

Tagi
system binarny, systemy liczbowe, ułamek dziesiętny, ułamki, ułamki dziesiętne

Szybka odpowiedź
Antispam, complete the task: 
 
Wiadomość:
Opcje

Narzędzia wątku Przeszukaj ten temat
Przeszukaj ten temat:

Zaawansowane wyszukiwanie
Wygląd

Zasady postowania
Nie możesz zakładać nowych tematów
Nie możesz pisać wiadomości
Nie możesz dodawać załączników
Nie możesz edytować swoich postów

BBCode jest Włączony
EmotikonyWłączony
[IMG] kod jest Włączony
HTML kod jest Wyłączony
Trackbacks are Wyłączony
Pingbacks are Wyłączony
Refbacks are Wyłączony


Podobne wątki
Temat Autor wątku Forum Odpowiedzi Ostatni post/autor
Excel zamiana liczby na cyfrę Winyl programy 5 08.05.2010 06:43
[PASCAL]Zamiana Binarne na dziesietne seba2122 programowanie 2 23.12.2008 00:15
[Pascal] Zamiana ułamków masta16 programowanie 2 07.12.2007 13:49
[C++] Liczby binarne, dodawanie datex504 programowanie 8 30.12.2006 14:40
[C++] Zamiana liczby arabskiej na rzymską johnny29 programowanie 2 20.11.2006 21:25


Wszystkie czasy w strefie GMT +2. Teraz jest 13:18.

Powered by vBulletin® Version 3.8.8 Beta 3
Copyright ©2000 - 2014, Jelsoft Enterprises Ltd.
Search Engine Friendly URLs by vBSEO 3.5.2
Tłumaczenie: vBHELP.pl - Polskie wsparcie vBulletin
1406287102

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345