» »

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...

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 -
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…



Vredno ogleda ...

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

float vs decimal

Oddelek: Programiranje
366259 (4392) Looooooka
»

PHP uganka (master level)

Oddelek: Programiranje
192216 (1644) technolog
»

kaj je to plavajoča vejica??

Oddelek: Loža
4010962 (7240) Mavrik
»

[C#] int v byte[] in nazaj

Oddelek: Programiranje
131801 (1573) BlueRunner
»

[Java] Liha potenca

Oddelek: Programiranje
81820 (1714) bijonda

Več podobnih tem