Forum » Programiranje » IEEE 754 - convert
IEEE 754 - convert
boss-tech ::
Zanima me kako lahko v C konvertiram IEEE 754 hex v float? Lahko tudi binary...
Mi ni čisto jasno: http://www.h-schmidt.net/FloatConverter...
Mi ni čisto jasno: http://www.h-schmidt.net/FloatConverter...
- spremenil: boss-tech ()
mihaelf3 ::
Predvidevam da gre za 32 bitno IEEE 754 število.
Najprej pretvori vso stvar v unsigned int ali nekaj kar je vsaj 32 bitov veliko (odvisno od arhitekture). Velikost tipa dobiš z sizeof.
Potem pa. Število je sestavljeno iz treh delov: predznak, eksponent, in mantisa. In en je bolj zakompliciran od drugega.
Predznak. Ta je še najlažji. Vzameš svoje število in vzameš 32. bit. Če je bit 0 je predznak +, sicer je predznak -
Eksponent. Naslednjih osem bitov (31 - 23) je eksponent. Vrednost tega dela izračunaš tako da od tistih bitov odšteješ 127 in potem vse skupaj uporabiš kot potenco na 2:
In potem je tu še mantisa. Ta trenutek se ne morem domisliti kako bi jo lahko izračunal brez zanke, tako da mogoče obstaja še kakšna elegantnejša rešitev. Gre se za to da so potem vsi preostali biti (22 - 0) 1/2, 1/4, 1/8, 1/16...
Na koncu je končen rezultat
Vem da sem vključil precej nelepe kode, ampak mislim da bi delala tudi na Javi, ki je kot vem tvoj jezik... Edino pow v C-ju je Math.pow v Javi. math.h boš potreboval zraven.
Odsvetujem ti da sam napišeš kodo, ki bo pretvarjala iz IEEE 745. Gotovo je kje na spletu že delujoča. Standard ima tudi še neke druge fore okoli zelo velikih (in majhnih števil), pozitivno in negativno 0 in pozizivno ter negativno neskončno.
Najprej pretvori vso stvar v unsigned int ali nekaj kar je vsaj 32 bitov veliko (odvisno od arhitekture). Velikost tipa dobiš z sizeof.
Potem pa. Število je sestavljeno iz treh delov: predznak, eksponent, in mantisa. In en je bolj zakompliciran od drugega.
Predznak. Ta je še najlažji. Vzameš svoje število in vzameš 32. bit. Če je bit 0 je predznak +, sicer je predznak -
int predznak = (stevilo >> 31) & 1 == 0 ? 1 : -1;
Eksponent. Naslednjih osem bitov (31 - 23) je eksponent. Vrednost tega dela izračunaš tako da od tistih bitov odšteješ 127 in potem vse skupaj uporabiš kot potenco na 2:
int biti = (stevilo >> 22) & 8; int eksponent = pow(2, biti - 127);
In potem je tu še mantisa. Ta trenutek se ne morem domisliti kako bi jo lahko izračunal brez zanke, tako da mogoče obstaja še kakšna elegantnejša rešitev. Gre se za to da so potem vsi preostali biti (22 - 0) 1/2, 1/4, 1/8, 1/16...
float mantisa = 0.0; for(i = 22; i <= 0; i--) { mantisa += pow(2, -23 + i) * ((stevilo >> i - 1) & 1); } mantisa += 1; // Mantiso je po standardu potrebno se povecati za 1. Tak so rekli.
Na koncu je končen rezultat
float rezultat = predznak * eksponent * mantisa;
Vem da sem vključil precej nelepe kode, ampak mislim da bi delala tudi na Javi, ki je kot vem tvoj jezik... Edino pow v C-ju je Math.pow v Javi. math.h boš potreboval zraven.
Odsvetujem ti da sam napišeš kodo, ki bo pretvarjala iz IEEE 745. Gotovo je kje na spletu že delujoča. Standard ima tudi še neke druge fore okoli zelo velikih (in majhnih števil), pozitivno in negativno 0 in pozizivno ter negativno neskončno.
torch it
sandmat ::
zgornja koda ima problem pri robnih primerih (S/QNAN, ničle, denormalizirana oblika). Uporabi knjižnico.
boss-tech ::
Sem že malo guglal, pa sploh ne najdem nekega pametnega primera v C. Čeprav bi po mojem se moralo že kje najt...
Zgodovina sprememb…
- spremenil: boss-tech ()
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | float vs decimalOddelek: Programiranje | 6259 (4392) | Looooooka |
» | PHP uganka (master level)Oddelek: Programiranje | 2216 (1644) | technolog |
» | kaj je to plavajoča vejica??Oddelek: Loža | 10962 (7240) | Mavrik |
» | [C#] int v byte[] in nazajOddelek: Programiranje | 1801 (1573) | BlueRunner |
» | [Java] Liha potencaOddelek: Programiranje | 1820 (1714) | bijonda |