2016-07-21 2 views
6

J'ai la fonction qui, selon moi, va convertir un int en une valeur à virgule flottante divisée en l'exposant du signe et fractionner les composantes de la valeur. Utiliser IEEE 754 pour représenter les valeurs Float.Doubler et diviser les valeurs à virgule flottante

enter image description here

unsigned test(unsigned x) {  
    // split the given bits of sign exponent and fraction, combine to return 

    unsigned int sign = (x & 0x80000000) >> 31; 
    unsigned int expo = (x & 0x7F800000) >> 23; 
    unsigned int frac = (x & 0x007fffff); 

    return (sign << 31) | (expo << 23) | frac; 
} 

Je ne suis pas sûr cependant comment je pourrais calculer les valeurs coupées en deux ou doublé de cette représentation à virgule flottante.

unsigned doubled(unsigned x) { 
    // get float 
    // float = unsigned int to float 
    // doubleFloat = 2*f 
    // if float is not a number 
     // return unsigned float 
    // else return unsigned integer of half float 

    unsigned int sign = (x & 0x80000000) >> 31; 
    unsigned int expo = (x & 0x7F800000) >> 23; 
    unsigned int frac = (x & 0x007fffff); 

    if (expo == 0xff) 
     return uf; 
    else ... 
} 
+1

Tout exposant de changement. Flottant = Fraction * 2^exposant * (signe? -1: 1). Notez, ici exposant est une valeur signée. – slavanap

Répondre

6

Il semble que vous utilisiez IEEE 754 pour représenter les valeurs Float.

Si vous voulez doubler la représentation binaire, il vous suffit d'incrémenter de 1 l'exposant. La même chose est vraie si vous voulez la moitié, juste décrémenter par 1

Rappelez-vous que cela est vrai que si votre numéro est à portée normale, y compris même après avoir doublé ou réduire de moitié

+0

simplement le bit décaler l'exposant par 1 << or >>? – Silverfin

+0

Si les nombres sont dans la plage normale, il suffit d'incrémenter/décrémenter (exp + = 1 ou exp - = 1) – Amadeus

+0

Comment les choses changent-elles si elles sont dénormalisées? – Silverfin