» »

kaj je to plavajoča vejica??

kaj je to plavajoča vejica??

MrX ::

kaj je to plavajoča vejica?? (v zvezi z računalništvom)
  • premaknil: Predator ()

Thomas ::

To so števila, kjer mesto decimalne vejice ni fiksno določeno.

Če bi bilo, oziroma kadar je, imamo pravzaprav opravka z računanjem s celimi števili.

S tistimi, ki so naprimer napisani v obliki eksponenta in mantise in nimajo vejice fiksne na naprimer 5. mestu od zadaj, pa je (bilo) težje računat.

Zato se je smatralo, da to je edino pravo računanje, koliko megaflopov - milijonov računskih operacij s tako formuliranimi števili - lahko izvede računalnik na sekundo.

Trenutno stane Giga flop na sekundo nekaj čez 200 US$. Če še.

p.s.

Please move topic to Z&T.


8-)
Man muss immer generalisieren - Carl Jacobi

dunker ::

"Floating point" je, kolkor jest vem, čisto navadna decimalna vejica, samo da se ne piše
569,2
ampak
569'2.
Verjetno bi vejica pomenila pri programiranju nadaljevanje k naslednjemu ukazu, tega pa pač nočemo in tako uporabljamo floating point.
IMHO. ;)

Thomas ::

Kermu zdej bolj verjamete? Meni al dunkerju? >:D
Man muss immer generalisieren - Carl Jacobi

Sumo ::

LOL dunker, kero klobaso si prbil :D

Thomas ::

To kar misli dunker, ni floating point ampak hanging point.

Če to hoh komo napišeš namesto navadne, se ti računalnik lahko obesi! Odtod ime - hanging point.

:))

Mislim, da tema lepo pridobiva na pogojih, da lepo ostane v Loži.
Man muss immer generalisieren - Carl Jacobi

Mavrik ::

Hmm, a nas niso pri matematiki učili, da je 532,5 enako 532'5 ?
The truth is rarely pure and never simple.

gumby ::

saj je enako... Thomas spet komplicira :D

joke

Zgodovina sprememb…

  • spremenil: gumby ()

BigWhale ::

Banzai!

Plavajoca vejica bolj znana tudi kot plavajoca veja ali pa plavajoc hlod. To je pac en kos lesa, ki plava v vodi. Pridevnik plavajoca se je ohranil zgolj kot retoricni dodatek, saj les v veliki vecini plava, by default...

Ce plavajoco vejico voda potisne na kako obalo/obrezje iz nje nastane naplavina...

Se kaj?

MrX ::

:D

Sergio ::

Se bom še jaz potrudil s svojo razlago, a vedite da pišem iz glave ter da bi rad zadevo razložil na popolnoma poljuden način.

Recimo, recimo da imamo nepredznačeno 32-bitno število. To pomeni, da je število pozitivno, ter lahko predstavi vsa cela števila med 0 in 232-1, kar je precejšen obseg za navadne smrtnike.

Zaradi narave računalnikov vsa števila prezentiramo v tem načinu.

Kako torej računalniku izgleda število 8, če ga podamo v 32-bitnem načinu?

00000000000000000000000000001000

Tukaj imate 32 mest, vsako od teh lahko zasede vrednosti le 0 oziroma 1.

Dobro, tako lahko v binarnem načinu podajamo integerje, torej cela števila.

Zadeva se malce zaplete pri ne-celih šteivlih. Tukaj so se vrli znanstveniki domenili, da lahko iz e.g. 32-bitne reprezentacije naredijo celo število, in to tako, da premikajo vejico.

Podana sta torej 2 argumenta: Cela reprezentacija števila ter mesto, kjer naj stoji vejica.

Če želimo imeti število 0.08, moramo podati zgoraj omenjeno binarno reprezentacijo, ter reči sistemu, naj "postavi" vejico 2 mesti v levo. Tako bo iz števila 8 nastalo število 0.08.

Zaradi tega je vejica plavajoča, ker dejansko operiramo nad celim številom ter prosto premikljivo vejico.

Težava nastane pri številih a'la 2/3 (0.66 periodično) ter neskončnih neperiodičnih iracionalkah a'la pi, ker enostavno nimaš toliko bitov, da bi natančno predstavil to število. (0,66666666666666666666666666666666 še vedno ni točno 2/3, 3.141592653589793238462643383279502884197169399 še vedno ni pi). Zatorej bodi previden pri podajanju natančnosti številu.

Je odgovor zadovoljiv ter razumljiv? :)
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

Thomas ::

Jest sem te razumu! :D
Man muss immer generalisieren - Carl Jacobi

Tody ::

JA bravo sergej !!

Eschelon ::

Zapis s plavajočo vejico po IEEE 754 standardu (ki je najbolj razširjen).
Noben bau bau.0:)

Dugajs ::

Kako pa se s tem računa?
Namreč jaz sem jutri vprašan informatiko in mi ni najbolj jasno... Za nalogo smo dobili primer: 45,125(10- desetiško) in moramo spravit v plavajočo vejico. S tem primerom se ubadam že 1 uro pa mi ne uspe. Prosim če bi lahko kdo na dolgo rešil ta primer ali razložil kako je s tem.

Hvala

bobby ::

Če sem Sergia prou zastopu, potem 45125 zapiš kot binarno in vejico postavi za tri mesta v levo.

45125 = 1011000001000101
potem pa ker ja floatng point pride

1011000001000,101


a sem prav zastopu?
Ce eksplicitno ne odgovorim osebam PNG ali PR,..I dont care about your opinion.

lymph ::

Na pol razumem. Ah vi matematiki in programerji.
"Belief is immune to counter example."

Sergio ::

@bobby: To sem pisal dobra 4 leta nazaj... ;-)

Razlika je, ce hoces nekaj "by the way" zapisati v zapisu s plavajoco vejico, drugo je pa stvar zapisati v IEEE.754 zapisu, ki je enoznacen in standarden.
Tako grem jaz, tako gre vsak, kdor čuti cilj v daljavi:
če usoda ustavi mu korak,
on se ji zoperstavi.

kekz ::

Če je:
1/3 = 0,3333333333333... in
2/3 = 0,6666666666666... , potem je po logiki
3/3 = 0,9999999999999... :D

Na cela števila, kot je v tem primeru 3/3 = 1, lahko pozabimo. >:D

Zgodovina sprememb…

  • spremenilo: kekz ()

Dugajs ::

aha torej bi bilo npr. 25,125 = 110001000100,101 ?

kekz ::

Res ste pesniki. Ali je že kdo sličal za eksponent in mantiso? :\
25,125 = 110001000100,101

In kako bi v bin označil vejico? Od kod ti ideja, da so 3 mesta za vejico v desetiškem tudi 3 mesta v dvojiškem? Tisto za vejico je binarno ,125?
Res smo globoko v loži...

Dugajs ::

Torej;
25,125(10) = ? (2) in pri računanju moramo uporabiti plavajočo vejico, naš profesor informatike je to razlagal sam sebi saj ga nihče ni razumel... Tak da prosim koga ki to zna da napiše

kekz ::

25,125(10) = 01000001110010010000000000000000 (IEEE-754 32-bit)

kekz ::

Še razlaga:
25,125= 0 10000011 10010010000000000000000
0 = predznak 0 -> +, 1 -> -

10000011 = vedno 8 bit eksponent zapisan kot razlika od "srednje" vrednosti 127. več od 127=pozitivno; 127=nič; manj od 127=negativno
10000011 = 131 = 127+4 -> to je torej 4 (pomeni 2^4)

10010010000000000000000 so decimalna mesta za vejico (binarno), celo mesto se po defaultu šteje, da je 1.
To je torej 1,1001001 binarno, kar je 1 + 1/2 + 1/16 + 1/128 = 1,5703125 (10)

In zdaj skupaj:
+ 1,5703125 * 2^4 = 25,125

Zgodovina sprememb…

  • spremenilo: kekz ()

Dugajs ::

Hvala vsem za pomoč vendar mislim da bo to jutri 1. Vglavnem ne razumem postopka:'(

Dugajs ::

"0000011 = 131 = 127+4 -> to je torej 4 (pomeni 2^4)" od kod 131??"
"10010010000000000000000 so decimalna mesta za vejico (binarno)" od kod pa tole dolgo število?

kekz ::

Obratni postopek:

1. Predznak je +, torej je prvi bit 0

2.
25,125 delimo z 2^n, da dobimo rezultat med med 1 in 2 (mora biti manjši od 2). To je 2^4 (drugače povedano, 4x moramo deliti z 2, da je rezultat med 1 in 2)

25,125 / 2^4 = 1,5703125

Torej je eksponent 4, kar se zapiše kot 127+4=131
(ker je 127=0, 128=1, 129=2, 130=3, 131=4)
Eksponent je zapisan z 8 biti, torej 131 = 10000011

3.
Decimalke ostanka iz prejšnje točke predstavimo binarno (celi del je vedno 1, zato ga ne rabimo zapisovati, niti vejice), samo
{,}5703125 = 1/2 + 1/16 + 1/128
To je binarno {,}1001001 in naprej do konca same ničle v dolžini 23 bitov (da je skupaj 32 bitov): 10010010000000000000000

Zgodovina sprememb…

  • spremenilo: kekz ()

Dugajs ::

Zdaj razumem vse razen pri 3. točki se mi malo zalomi.. kako je lahko 5703125(10) = 1001001(2) ? Namreč jaz dobim ven: 5703125 = 10101110000010111010101(2) kje se motim?

Zgodovina sprememb…

  • spremenilo: Dugajs ()

Izi ::

Še moja laična razlaga.

Število je razdeljeno na tri dele.
0 00000000 00000000000000000000000
Prvi del (ena številka) pove samo ali je število pozitivno če je 0 ali negativno če je 1
Drugi del 8 številk je eksponent. Eksponent je število, ki izraža stopnjo potence.
Tretji del 23 številk pa je Fraction oz. ulomek po slovensko.

V drugi del lahko spraviš največ 11111111 binarno, kar je enako 255 desetiško. Ampak števila ne gredo od 0 do 255 ampak od -127 do +127, zato od števila iz tega drugega dela vedno odšteješ 127.
Za drugi del vedno računaš 2^(X-127). X je tisto število v drugem delu.

Če gremo k tvojemu primeru 25,125. Številko, ki gre v drugi del je simpl dobiti. 2^5=32, kar je že več kot je tvoje število, zato greš eno nižje in 2^4=16.
Tvojo številko 25,125 ÷ 16 = 1,5703125. 16 porabiš za drugi del (8 številk), 1,5703125 pa za tretji del.

Ker je tvoje število pozitivno, je prvi del številka 0. Prvi del zaključen.

V drugi del gre 16 = 2^4 = 2^(X-127) Tale X je drugi del. Če je X-127 = 4 pomeni, da je X = 131. Torej v drugi del gre številka 131, ki jo je najprej treba spremeniti v binarno in to je 10000011
Kako 131 desetiško spremeniš v 100000011 binarno pa verjetno že veš. Tukaj je najbolje imeti en kalkulatorček, ki ti desetiško pretvarja v binarno :D

Potem pa moraš samo še 1,5703125 spremeniti v binarno in vse skupaj vpisati v tretji del.
1 cela je skriti bit, ki se ga ne piše ostane ti 0,5703125
Tukaj spet rabiš kalkulatorček, ampak princip gre nekako takole:
0,5703125 = 1/2 + 0/4 + 0/8 + 1/16 + 0/32 + 0/64 + 1/128 + 0/256 + ..... + 0/8388610 = (preneseš samo zgornje vrednosti ulomkov) = 10010010000000000000000

25,125 = 0 100000011 10010010000000000000000


Edit: Še odgovor na vprašanje:
kako je lahko 5703125(10) = 1001001(2) ?
kekz je malo narobe razložil :D
Ti ne spreminjaš 5703125 v binarno. Rezultat bi bil res 10101110000010111010101
Ti spreminjaš število 0,5703125 v binarno in to je bistvena razlika. Rezultat je 10010010000000000000000

Zgodovina sprememb…

  • spremenil: Izi ()

Dugajs ::

Kako pa lahko pretvoriš 0,5703125 v dvojiški sestav? Če želim to izračunati s kalkulatorjem v widowsih mi kaže da bi naj to bilo 0(2)

Zgodovina sprememb…

  • spremenilo: Dugajs ()

Izi ::

kako pretvoriti 0,5703125 v binarno je že drug problem, ki ga tukaj ne bi razlagal matematično.
V principu se gre za 23 ulomkov, kot je prikazano. Kako to praktično uporabiti pri računanju brez kalkulatorja pa bo morda razložil kekz >:D
Jaz uporabljam računalnik, ki ima to funkcijo že vnešeno in to računa samodejno :D

Drugače pa je tukaj kalkulator, ki celoten postopek plavajoče vejice izračuna samodejno za 32 in 64 bitov. Link
Za decimalko uporabljaj piko in ne vejice !

Dugajs ::

Najlepša vama hvala !

Obssesen ::

S temle kalkulatorjem je malo čudno, ker sam imam -10,25 za zapisat z decimalno vejico in dobim, 1 kot -, če prav razumem potem pa nule in vmes decimalna vejica. :-/

nba4 ::

no zdj mi je ži vse bol jasn

zanima me še sam za zdni del
a lahk to s kalkulatorjem na kompu izračunaš al gre sam s tem k ga je izi dau?

js sm s kalkulatorjem šou spreminjat 0,5703125 v binarno pa mi ni hotl spremenit kr 0 je napisal.. zakaj to???

Zgodovina sprememb…

  • spremenil: nba4 ()

Izi ::

Izgleda je nekdo manjkal pri uri spreminjanja decimalnih števil v binarna :D
Ali pa se danes smatra, da to že vsak otrok obvlada in v šoli tega sploh ne učijo več >:D

Pri celih številih delimo z 2 dokler ne dobimo celotnega binarnega števila.
Pri številih manjših od 1 pa množimo z 2 dokler ne dobimo celotnega binarnega števila.
To je vse. Simpl ko pasulj in vse se da izračunati brez kalkulatorja, edino en papirček je treba imeti, da si nekam zapisuješ vse tiste ničle in enke :D

Kako to izgleda v praksi, če računamo na papir popolnoma brez računalnika:

V drugem delu (8-bitov) moramo število 131 pretvoriti v decimalno
131 pretvorimo v binarno z deljenjem z 2 dokler ne pridemo do 0,5
in prepisujemo ostanke.
če je ostanek 0 se prenese 0
če je ostanek 0,5 se ga pomnoži z 2 in se prenese 1

131 ÷ 2 = 65,5 ostanek je 0,5 * 2 = 1 (naprej prenesemo samo celo število 65)
65 ÷ 2 = 32,5 ostanek je 0,5 * 2 = 1
32 ÷ 2 = 16,0 ostanek je 0
16 ÷ 2 = 8,0 ostanek je 0
8 ÷ 2 = 4,0 ostanek je 0
4 ÷ 2 = 2,0 ostanek je 0
2 ÷ 2 = 1,0 ostanek je 0
1 ÷ 2 = 0,5 ostanek je 0,5 * 2 = 1

Pregledamo vse ostanke in dobimo 11000001
Končni rezultat je torej 131 desetiško je 11000001 dvojiško

----------

V tretjem delu (23-bitov) moramo število 0,5703125 pretvoriti v binarno
Decimalno število vedno množiš z 2 in v tretji del vpisuješ samo cela števila od dobljenih rezultatov.
Če je rezultat večji od 1 v tretji del vpišeš številko 1, če je manjši od 1 se vpiše 0.
Pomembno: Ker si recimo od 1,140625 odvzel 1 v naslednjo vrstico vpišeš 0,140625

0,5703125 * 2 = 1,140625 odvzameš 1
0,140625 * 2 = 0,28125 odvzameš 0
0,28125 * 2 = 0,5625 odvzameš 0
0,5625 * 2 = 1,125 odvzameš 1
0,125 * 2 = 0,25 odvzameš 0
0,25 * 2 = 0,5 odvzameš 0
0,5 * 2 = 1 odvzameš 1

Vpisuje se torej samo tisto kar smo odvzeli. Dobimo 1001001

Končni rezultat je torej 0,5703125 (decimalno) = 0,1001001 (binarno)

Zgodovina sprememb…

  • spremenil: Izi ()

blblb ::

Pregledamo vse ostanke in dobimo 11000001
Končni rezultat je torej 131 desetiško je 11000001 dvojiško


Narobe. Rezultat je 10000011 ker nicle in enice prepises od spodaj navzgor...
Lahko pa tudi tako pogledas > 128 *1 + 64*0 + 32*0 + 16*0 + 8*0 + 4*0 + 2*1 + 1*1 = 131

edit: v tvojem primeru Izi bi bil rezultat 193.

lp, blblb

Zgodovina sprememb…

  • spremenil: blblb ()

Izi ::

Imaš prav, od spodaj navzgor je treba iti.
Že celo večnost nisem tako računal, ko pa imamo računalnike za take reči :D

nba4 ::

ful vam hvala:D
sami cari ste:D

Enzo` ::

Eno vprasanje. Kako odstevamo v IEEE 754 standardu? Oz. kako sestejemo stevili, zapisani v tem standardu, ce je eno od teh negativno?

gendale ::

pomoje isto kot seštevaš, samo da pri mantisi upoštevaš:
a - b = a + ne b + 1

Mavrik ::

Števila seštevaš popolnoma normalno, s tem da moraš jasno najprej obe števili poravnati na isto mantiso.
The truth is rarely pure and never simple.


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

float vs decimal

Oddelek: Programiranje
366259 (4392) Looooooka
»

IBM-ov Mira cilja na vrh lestvice Top500

Oddelek: Novice / Znanost in tehnologija
275522 (4215) HairyFotr
»

C++ double _1.0000imavrednost0.99999

Oddelek: Programiranje
131580 (1333) Spura
»

[C] paranormalni pojav

Oddelek: Programiranje
81261 (881) snow
»

pretvarjanje-številski sistemi

Oddelek: Programiranje
52873 (2839) Tutankhamun

Več podobnih tem