2016-07-21 55 views
6

Bir int'yi, değerin işaret üssüne ve fraksiyon bileşenlerine bölünmüş kayan nokta değerine dönüştüreceğine inandığım bir işleve sahibim. Float değerlerini göstermek için IEEE 754'ü kullanma.Kayan nokta değerlerini ikiye katlama ve bölme

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; 
} 

Ben bu kayan nokta gösteriminden yarıya veya ikiye değerlerini hesaplamak olabilir ancak nasıl emin değilim.

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

Hemen değişim üs yarıya indirme sonra. Float = Fraksiyon * 2^üs * (işaret? -1: 1). Not, burada üstel imzalı bir değer. – slavanap

cevap

6

Float değerlerini göstermek için IEEE 754 kullanıyorsunuz.

İkili gösterimi iki katına çıkarmak isterseniz, yalnızca 1 kişi tarafından artırmanız gerekir. Eğer yarısına istiyorsanız, aynı sadece sayı olmak üzere normal aralıkta olup yalnızca bu doğrudur unutmayın 1

tarafından eksiltme, doğrudur hatta iki katına ya

+0

sadece üssü 1 << or >> olarak değiştiriyor>? – Silverfin

+0

Sayılar normal aralıkta ise, sadece artış/azaltma (exp + = 1 veya exp - = 1) – Amadeus

+0

Denormalize edilirse işler nasıl değişir? – Silverfin