2016-07-21 42 views
6

Ich habe die Funktion, die ich glaube, wird ein int in einen Gleitkommawert umgewandelt in den Vorzeichen Exponenten und Bruch Komponenten des Wertes. Verwenden von IEEE 754 zur Darstellung von Float-Werten.Verdoppelung und Division von Fließkommawerten

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

Ich bin aber nicht sicher, wie ich die halbiert oder verdoppelt Werte aus dieser Gleitkommadarstellung berechnen könnte.

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

Gerade Änderung Exponenten halbieren. Float = Bruch * 2^Exponent * (Zeichen? -1: 1). Beachten Sie, dass hier der Exponent ein vorzeichenbehafteter Wert ist. – slavanap

Antwort

6

Es scheint, dass Sie IEEE 754 verwenden, um Float-Werte darzustellen.

Wenn Sie die binäre Darstellung verdoppeln möchten, müssen Sie nur das Exponent um 1 erhöhen. Das gleiche gilt, wenn Sie auf der Hälfte wollen, verringert nur um 1

Denken Sie daran, dass dies wahr ist nur, wenn Ihre Zahl im normalen Bereich liegt, sogar nach Verdoppelung oder

+0

einfach Bit Verschiebung des Exponenten um 1 << or >>? – Silverfin

+0

Wenn Zahlen im normalen Bereich sind, nur inkrementieren/dekrementieren (exp + = 1 oder exp - = 1) – Amadeus

+0

Wie ändern sich die Dinge, wenn sie denormalisiert sind? – Silverfin