Following the bit-level floating-point coding rules, implement the function with the following prototype:
/* * Compute (int) f * If conversion casues overflow or f is NaN, return 0x80000000 */intfloat_f2i(float_bits f);
For floating-point number f, this function computes (int) f. Your function should round toward zero. If f cannot be represented as an integer, then the function should return 0x80000000.
Test your function by evaluating it for all 2^32 values of argument f and comparing the result to what would be obtained using your machine's floating-point operations.
Code:
#include<stdio.h>#include<assert.h>typedefunsigned float_bits;floatu2f(unsigned u) {return*(float*)&u;}intfloat_f2i(float_bits f) {unsigned sign = f >>31;unsigned exp = f >>23&0xFF;unsigned frac = f &0x7FFFFF;unsigned bias =0x7F;int result;unsigned E;unsigned M;if (exp < bias) { /* the float number is less than 1 */ result =0; } elseif (exp >=31+ bias) { /* overflow */ result =0x80000000; } else { /* normal */ E = exp - bias; M = frac |0x800000;if (E >23) { result = M << (E -23); } else { /* round to zero */ result = M >> (23- E); } }return sign ?-result : result;}intmain() {assert(float_f2i(0x98765432) == (int)u2f(0x98765432));assert(float_f2i(0x19802385) == (int)u2f(0x19802385));assert(float_f2i(0x78000087) ==0x80000000);assert(float_f2i(0x8F088888) == (int)u2f(0x8F088888));return0;}