dekadni u binarni

Peruzzi

Domaćin
Poruka
4.066
Kako da prevedem dekadni broju binarni?

Svuda ima za prirodne brojeve, a to sam i sam se snasao, deljenje sa dva pa ostatak ili ubacivanje stepena dvojke pa oduzimanje. svejedno oba rade, ali sta da radim sa onim IZA zareza?

Uradio sam nesto koda i pretvara recimo 0.625, 0.75, 0.5, i slicne kako treba a recimo za 0.87 udje u mrtvu petlju, pa sam ogranicio na max sto cifara i izbaci neki stocifreni niz 1 i 0, i najbudjavije od svega taj broj ne mogu da konvertujem posle u dekadni, izbaci gresku

Evo vam kod koji prevodi sve to, ono sto nema to je da je edit1 edit kontrola u koju se ukucava broj koji se konvertuje a edit2 je rezultat konverzije
delphi naravno

procedure TForm1.Button1Click(Sender: TObject);
{convert}
var
dva,i,poz:integer; {stepen dvojke prilikom konverzije celog dela, 2 4 8}
vrednost:real; {rezultat}
ceo:integer; {ceo deo dec broja}
neceo:real; {deo iza zareza dekadnog broja}
konvertovan:string; {string u kome se cuva rezultat}
broj:string; {broj koji se konvertuje, broj=ceo+neceo}
dvadva:real; {stepen dvojke prilikom konverzije necelog dela, 0.5 0.25}
cifre:integer; {broj cifara u bin broju iza zareza}
begin
if converzija then {ako je konverzija binarni u dekadni, tj deo koda koji pretvara bin u dec}
begin
poz:=pos('.',edit1.Text);
dva:=1;
vrednost:=0;
for i:=poz-1 downto 1 do
begin
vrednost:=vrednost+StrtoFloat(edit1.text)*dva;
dva:=dva*2;
end;
dva:=1;
for i:=poz to length(edit1.Text) do
begin
vrednost:=vrednost+StrToFloat(edit1.Text)*(1/dva);
dva:=dva*2;
end;
edit2.Text:=floattostr(vrednost);
end
else {ako je dekadni u binarni, tj deo koda za konverziju dekadnog u binarni}
begin
{razdvoji na ceo deo i deo iza zareza,
ceo deo pretvara deljenjem sa dva pa na ostatak,
neceo deo (iza zareza) pretvara stavljanjem stepena dvojke i oduzimanjem}
broj:=edit1.text;
{razdvaja}
neceo:=strtofloat(copy(broj, pos('.',broj),length(broj)-pos('.',broj)+1));
ceo:=strtoint(copy(broj, 1, pos('.',broj)-1));
{pretvara ceo}
repeat
konvertovan:=inttostr(ceo mod 2) + konvertovan;
ceo:=ceo div 2;
until ceo=0;
{pretvara neceo}
dvadva:=0.5;
konvertovan:=konvertovan+'.';
cifre:=0;
repeat
cifre:=cifre+1; {izbegava mrtvu petlju}
if dvadva<=neceo then begin
neceo:=neceo-dvadva;
konvertovan:=konvertovan+'1';
end
else konvertovan:=konvertovan+'0';
dvadva:=dvadva*0.5;
until ((neceo=0.0) or (cifre=100));

edit2.text:=konvertovan;
end;
end;



prijatno
 
primetio sam da se binarni brojevi sa zarezom (ne celi) prevedeni u dekadne zavrsavaju nuzno sa 5

da li je to znaci da su dekadni racionalni brojevi koji se ne zavrsavaju sa 5 u binarnom sistemu iracionalni?
 
Hm, racionalni su racionalni, bez obzira na osnovu... Ako nema petice, to znači da je potrebno ići podaleko udesno, kod binarnog zapisa, da bi se skrpio taj broj od razlomaka 1/4, 1/8, 1/16 itd... Gvirni malo u ovo
 
prvi bit desno od zareza je logicno baza^ -1, drugi baza^ -2 itd itd. E sada konverzija dekadnog u binarni realni broj se realizuje na sledeci nacin. Cijeli dio broja se dobija na standardni nacin, djeljenjem broja sa bazom sve dok se ne dobije 0 ostatak, a dio iza zareza se dobija mnozenjem u ovom slucaju sa 2.
Primjer:
broj 7.5 =
7:2
----------
3 - 1
1 - 1
0 - 1
Dakle 7 je '111'
A iza zareza se dakle mnozi sa 2:
5*2
------
1. 0 // cita se prema dole lijevo od zareza, dok ostatak je desno od zareza i on se mnozi dalje sa dva sve dok ne bude ostatak 0, u ovom slucaju je ostatak odmah 0, jer je 1*2^-1 = 1 * (1/2) = 0.5

Tako da gorespomenuti broj 7.5 je binarno 111.1
 
ali i dalje ne znam da li program ima gresku ili tako i treba da ispadne?

ako neko ovde hoce da proveri neka ostavi neku adresu da mu pustim ceo delphi projekat, ima sveukupno 200kb zip, 400 kad se raspakuje
 
Južnivetar ti je dobro objasnio osnovu konverzije. Osnovni problem konverzije iz dekadnog u binarni sistem je da ta konverzija ne može biti potpuno tačna odnosno da se ne može svaki racionalni broj iz dekadnog sistema TAČNO predstaviti u binarnom. Najjednostavniji primjer je broj 0,1 u dekadnom sistemu. Tu je on racionalan. Međutim, u binarnom sistemu ne može se tačno predstaviti jer je to
0,0001100110011001100... itd tj niz 1100 ponavlja se do u beskonačno pa je dekadno 0,1 u binarnom sistemu iracionalan broj. Ne mogu da komentarišem sam kod, mrzi me da čitam kad nije nazubljen jer se lako izgubim, ali je vjerovatno da si dobro odradio dek->bin konverziju. Onu drugu nisam gledao.
 
e yebiga. ako ne uvedem restrikciju za broj cifara ode program u mrtvu petlju znaci?

hm...

sad cu da ostavim program na http://peruzzi.dzaba.com/converter.zip ima oo 200 kb ceo delphi projekat pa ako nekom dosadno nek pogleda i proveri sta ne valja, ako ne valja

ako neko i testira - ukucaj 0.87 i pretvori u binarni, pa onda dobijeni broj pretvori ponovo u dekadni
meni izbaca gresku
 
Potoji alat koji se zove debugger. Pomenuti alat se nalazi u okviru Delpho razvojnog okruženja, te postaviš breakpoint na početak procedure koju si posla, pokreneš aplikaciju, uneseš broj koji hoćeš da konvertuješ i kada stane na početak pomenute procedure zbog breakpointa, onda korak po korak gledaj šta se dešava.
 
MGordan:
Južnivetar ti je dobro objasnio osnovu konverzije. Osnovni problem konverzije iz dekadnog u binarni sistem je da ta konverzija ne može biti potpuno tačna odnosno da se ne može svaki racionalni broj iz dekadnog sistema TAČNO predstaviti u binarnom. Najjednostavniji primjer je broj 0,1 u dekadnom sistemu. Tu je on racionalan. Međutim, u binarnom sistemu ne može se tačno predstaviti jer je to
0,0001100110011001100... itd tj niz 1100 ponavlja se do u beskonačno pa je dekadno 0,1 u binarnom sistemu iracionalan broj. Ne mogu da komentarišem sam kod, mrzi me da čitam kad nije nazubljen jer se lako izgubim, ali je vjerovatno da si dobro odradio dek->bin konverziju. Onu drugu nisam gledao.

hmmm
kako to mislis?
taj broj u tom slucaju nije 0,0001100110011001100..... vec to zavisi od bitnosti procesora
 
bojan p:
Bitnost procesora nema nikakve veze u ovom slučaju, jer je reč o teoriji kako se konvertuju brojevi iz binarnog sistema u dekadni i obrnuto.
Teorija je OK pa autoru teme ostaje samo da je iskodira kako treba.

Obersturmfuehrer:
hmmm
kako to mislis?
taj broj u tom slucaju nije 0,0001100110011001100..... vec to zavisi od bitnosti procesora
Da razmotrimo malo termine racionalan i iracionalan broj:
Mi smo navikli da te termine koristimo u svjetlu brojnog (ili brojevnog, kako bi rekao moj profesor) sistema koji koristimo - dakle dekadnog. Međutim, racionalnost nekog broja vezuje se za korišteni brojni sistem pa neki broj u jednom sistemu može biti racionalan a u drugom iracionalan. Kako se to određuje. Ako se neki broj u datom brojnom sistemu može tačno prikazati uz konačan broj cifara tog brojnog sistema, tada je on racionalan u tom brojnom sistemu. Ako to nije moguće, on je iracionalan u tom brojnom sistemu. Bitnost procesora i način predstavljanja nekog realnog broja u procesoru nemaju veze s ovim teoretskim definicijama. Način predstavljanja broja (a ne bitnost procesora - to su dvije različite stvari) utiče samo na tačnost predstavljanja nekog broja tj. na grešku predstavljanja.
Vratimo se na onaj moj primjer broja 0,1 u dekadnom brojnom sistemu. U tom sistemu to je racionalan broj. Kad se konvertuje u binarni sistem, u njemu je to iracionalan broj i kao takav ne može se tačno predstaviti u računaru, bez obzira koliko bita upotrijebili.

Da bih bio jasniji oko ovoga, a i načina na koji se to predstavlja u procesoru, a pošto ovdje ne mogu korektno formatirati tekst, prilažem razmatranje teme urađeno u wordu.
 

Prilozi

  • IEEE 754 FP STANDARD.doc
    39,5 KB · Pregleda: 11
hm, trebalo je malo da porazmislim pre nego sto nesto napisem i da li da napisem...ovim sam se bavio jako davno, a vezano za Motorolu 6800, tako da pitaj boga sta sam hteo da kazem...
uglavnom, pogledacu ovaj tekst, smao da instaliram neki word viewer, posto sam skoro reinstalirao sistem, pa nemam nista...
 
Racionalan broj je onaj koji se može napisati u vidu razlomka. Iracionalan ne može (npr. sqrt(2)), a transcedentan ne može biti rešenje algebarske jednačine sa celim koeficijentima (npr broj e ili pi).
Zašto je 0,1 u binarnoj notaciji iracionalan? On se može (u 0i1 sistemu) predstaviti kao razlomak -> 1/1010. Predstavljanje u računaru je druga stvar...
 
maksvel:
Racionalan broj je onaj koji se može napisati u vidu razlomka. Iracionalan ne može (npr. sqrt(2)), a transcedentan ne može biti rešenje algebarske jednačine sa celim koeficijentima (npr broj e ili pi).
Zašto je 0,1 u binarnoj notaciji iracionalan? On se može (u 0i1 sistemu) predstaviti kao razlomak -> 1/1010. Predstavljanje u računaru je druga stvar...
Maks, u pravu si. Malo sam sad prelistao neke knjige. Moja greška. Očigledno se previše petljam s mašinama pa sam navikao razmišljati u tim okvirima.
 

Back
Top