Chinaunix首页 | 论坛 | 博客
  • 博客访问: 1396177
  • 博文数量: 143
  • 博客积分: 10005
  • 博客等级: 上将
  • 技术积分: 1535
  • 用 户 组: 普通用户
  • 注册时间: 2006-10-23 17:25
个人简介

淡泊明志 宁静致远

文章分类

全部博文(143)

文章存档

2011年(2)

2009年(1)

2007年(22)

2006年(118)

我的朋友

分类: 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;

}

阅读(2857) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~