2016-07-21 34 views
6

我有我認爲將int轉換爲浮點值的功能,該浮點值拆分爲值的符號指數和分數部分。使用IEEE 754來表示浮點值。加倍和除法浮點值

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

我不確定我可是如何從這個浮點表示計算減半或加倍值。

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

只是改變指數之後。 Float = Fraction * 2^exponent *(sign?-1:1)。請注意,這裏的指數是一個有符號的值。 – slavanap

回答

6

看來您正在使用IEEE 754來表示浮點值。

如果您想將二進制表示加倍,您只需要將expoent加1。如果你想要半也是如此,只是1

遞減請記住,這是真的只是如果你的號碼是在正常範圍內,甚至包括加倍或減半

+0

簡單地將指數移位1 << or >>? – Silverfin

+0

如果數字在正常範圍內,只是增加/減少(exp + = 1或exp - = 1) – Amadeus

+0

如果事情發生非規範化,情況會怎樣變化? – Silverfin