Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*
- * float_i2f - Return bit-level equivalent of expression (float) x
- * Result is returned as unsigned int, but
- * it is to be interpreted as the bit-level representation of a
- * single-precision floating point values.
- * Legal ops: Any integer/unsigned operations incl. ||, &&. also if, while
- * Max ops: 30
- * Rating: 4
- */
- unsigned float_i2f(int x){
- unsigned leftshift =0;
- unsigned frac32 ;
- unsigned frac23;
- unsigned guard;
- unsigned anssign;
- unsigned exponent;
- unsigned answer;
- int temp;
- int help;
- int tmin = 0x80000000;
- // Determine the signed bit
- if (x<0)
- anssign = tmin;
- else
- anssign =0;
- // case for zero
- if (!x)
- return 0;
- if (anssign)
- // If -ve make +ve
- {
- x = -x ;
- }
- while (!((tmin) & (x)))
- // shift it to the left till u get to leading 1
- {
- // x = x*2;
- x = x<<1;
- leftshift = leftshift +1;
- }
- // fraction in 32 bits
- frac32 = x<<1;
- // determining exponent
- exponent = 158 - (leftshift) ;
- //guard bit
- guard = (frac32 & (0x200))>>9;
- //round + stick bits
- help = frac32 & (0x000001ff);
- frac23 = frac32>>9;
- answer = anssign + (exponent <<23) + frac23;
- if (help > 0x00000100 || ((help==0x00000100) && (guard)) )
- // rounding condition
- {
- // to ensure that overflow goes on to exponent we do rounding on exponent + frac
- temp = (exponent<<23) + frac23;
- // rounding up
- return anssign + (temp+1);
- }
- return answer;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement