2f
#include <stdio.h>
typedef unsigned float_bits;
typedef unsigned char *byte_pointer;
void show_bytes(byte_pointer start,int len)
{
int i;
for(i = 0;i < len;i++)
{
printf(" %.2x",start[i]);
}
printf("\n");
}
void show_float(float x)
{
show_bytes((byte_pointer) &x,sizeof(float));
}
float_bits float_twice(float_bits f)
{
unsigned sign = f>>31;
unsigned exp = f>>23&0xff;
unsigned frac = f&0x7fffff;
if((exp == 0xff) || (exp == 0xfe))
return f;
if((exp < 0xfe) && (exp != 0))
exp = exp + 1;
if(exp == 0)
{
if((frac & 0x10000000) == 0x10000000 )
{
exp = exp + 1;
frac = frac & 0x7fffffff;
frac = frac << 1;
}
else
frac = frac << 1;
}
return (sign<<31) | (exp<<23) | frac;
}
int main()
{
unsigned u,ur;
float f,fr;
for(u = 0;u <= 0x0fffffffu;u++)
{
f =*((float *)&u);
f=f*2;
ur = float_twice(u);
fr = *((float *)&ur);
if(fr == f)
printf("%u: %x %x ok\n",u,f,fr);
else
{
printf("%u: error\n",u);
printf("the f is \n");
show_float(f);
printf("th fr is %\n");
show_float(fr);
printf("%x %x\n",f,fr);
return -1;
}
}
return 0;
}