淡泊明志 宁静致远
分类: C/C++
2006-12-07 22:02:42
【C语言库函数源代码】
【本程序在Dev C++ 4.9.9.2 下编译通过】
/*
把浮点数x分解成尾数和指数。x=m*2^exptr,m为规格化小数。
返回尾数m,并将指数存入exptr中。
*/
double my_frexp01(double x, int *exptr)
{
union
{
double d;
unsigned char c[8];
} u;
u.d = x;
//得到移码,并减去1022得到指数值。
*exptr = (int)(((u.c[7]
& 0x7f) << 4) | (u.c[6] >> 4)) - 1022;
//把指数部分置为0x03FE
u.c[7] &= 0x80;
u.c[7] |= 0x3f;
u.c[6] &= 0x0f;
u.c[6] |= 0xe0;
return u.d;
}
double my_frexp02(double x, int *eptr)
{
union
{
double v;
struct
{
unsigned
mantissa2 : 32;
unsigned
mantissa1 : 20;
unsigned
exponent : 11;
unsigned
sign : 1;
} s;
} u;
if (x)
{
u.v = x;
//得到移码,并减去1022得到指数值。
*eptr = u.s.exponent - 1022;
//把指数部分置为0x03FE
u.s.exponent = 1022;
return(u.v);
}
else
{
*eptr = 0;
return((double)0);
}
}
main()
{
float x,y;
int exp;
y = 64.0;
x = my_frexp01(y,&exp);
printf("%f=%.2f*2^%d\n",y,x,exp);
x = my_frexp01(-y,&exp);
printf("%f=%.2f*2^%d\n",y,x,exp);
printf("\n************************\n");
x = my_frexp02(y,&exp);
printf("%f=%.2f*2^%d\n",y,x,exp);
x = my_frexp02(-y,&exp);
printf("%f=%.2f*2^%d\n",y,x,exp);
system("pause");
return 0;
}