实现浮点数 0.5f,运行成功,特别是要注意舍入运算,是偶数舍入!
#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_half(float_bits f)
{
unsigned sign = f>>31;
unsigned exp = f>>23&0xff;
unsigned frac = f&0x7fffff;
if(exp == 0xff)
return f;
if(exp == 0)
{
if ((frac & 0x00000001) == 1)
{
if ((frac & 0x00000002) == 0x00000002)
frac = (frac + 1) >> 1;
else
frac = frac >> 1;
}
else
{
frac = frac >> 1;
}
}
if(exp == 1)
{
exp = exp - 1;
if ((frac & 0x00000001) == 1)
{
if ((frac & 0x00000002) == 0x00000002)
frac = (frac + 1) >> 1;
else
frac = frac >> 1;
}
else
{
frac = frac >> 1;
}
frac = frac + (1 << 22);
}
if(exp > 1)
{
exp = exp - 1;
}
return (sign<<31) | (exp<<23) | frac;
}
int main()
{
unsigned u,ur;
float f,fr;
for(u=8388607;u<=0x0fffffffu;u++)
{
f =*((float *)&u);
f=f*0.5;
ur = float_half(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;
}