IEEE754 C 語言代碼

void ConvertDexToIEE754(float fpointer,unsigned char *a)  //十進制轉化爲 IEEE745 小數
{   
    int Flag=0;
    double   integer,decimal;    //整數,小數  
    unsigned  long   bininteger,bindecimal;   //二進制整數,二進制小數
    int   _power,i;
    
    if(fpointer<0)
    {
      fpointer=fpointer*(-1);
      Flag=1;
    }

    decimal = modf(fpointer,&integer);   //將整數位到存到 integer ,小數位返回到decimal
    if(decimal || integer)    //判斷 fpointer是否爲0
    {         
     bindecimal = (unsigned  long )(decimal * 0x800000);   //0x800000=2^23 。得到小數位二進制表現形式         
     while((bindecimal & 0xff800000) > 0) //計算有沒有超過23位二進制數           
     bindecimal >>= 1;         
     if(integer > 0)        
     {              
      bininteger = (unsigned  long )integer;             
       for(i=0;i<32;i++)               //計算整數部分的2的冪指數,整數位轉化爲二進制後的位數,計算小數點移動的位數
       {
          if(bininteger&0x1)
         _power = i;
         bininteger >>= 0x1;
       }
    bininteger = (unsigned  long )integer;
    bininteger &= ~(0x1 << _power); //去掉最高位的1
    if(_power >= 23) //如果冪指數>23 則捨棄小數位部分
    {
          bininteger >>= (_power-23);
          bindecimal = 127+_power;
          bininteger |= bindecimal << 23;
    }
    else
    {
          bininteger <<= (23 - _power);//將去掉最高位的整數二進制,移至第22爲
          bindecimal >>= _power;       //將小數部分左移1,
          bininteger |= bindecimal;    //二者向或得到1.x的x,
          bindecimal = 127+_power;     //指數,右移的小數點數+127
          bininteger |= bindecimal << 23; // 指數爲右移23爲變爲或上x。
    }
  }
    else if(integer == 0)
    {
            bindecimal <<= 9; //將小數部分的二進制移至最高位31位
            _power = 0;
            bininteger = bindecimal;
            while(bininteger == ((bindecimal<<1)>>1)) //判斷小數位最高位是否爲1.  最高位爲0 :真
            {
              _power++;
              bindecimal <<= 0x1;
              bininteger = bindecimal;  //直到最高位爲1,退出循環
            }
            _power++;
            bindecimal <<= 0x1;    //將1.x的1去掉 求x的值,
            bindecimal >>= 9;      //將小數位回到0-22位   
            bininteger = bindecimal; //暫存到二進制整數中,
            bindecimal = 127-_power;
            bininteger |= bindecimal << 23;  //將指數爲右移值23爲向或得到其值,
    }
     if(Flag==1)
      bininteger |= 0x80000000;


    i = 0;
    a[i++] =(unsigned char) ((bininteger >> 24) & 0xff);
    a[i++] = (unsigned char)((bininteger >> 16) & 0xff);
    a[i++] = (unsigned char)((bininteger >> 8 ) & 0xff);
    a[i++] =(unsigned char)( bininteger & 0xff);
    }
}

float ConvertIEE754ToDex(unsigned char *SpModRegister)
{
float x,fpointer;
unsigned long bininteger,bintmp;
int _power,i=0,s;

bintmp = SpModRegister[i++] << 8;
bintmp |= SpModRegister[i++];
bininteger = SpModRegister[i++] << 8;
bininteger |= SpModRegister[i++];
bininteger |= bintmp << 16;

if(bininteger == 0)
return 0.0;

bintmp = bininteger & 0x7FFFFF;
x = (double)bintmp / 0x800000;
bintmp = bininteger >> 23;
_power = bintmp & 0xff;

bintmp = bininteger & 0x80000000;
s = (bintmp) ? 1 : 0 ;

bintmp =(unsigned  long ) pow(2,fabs(_power-127)) ;
if(_power >= 127)
fpointer = (1+x) * bintmp ;
else
fpointer = (1+x) / bintmp ;
//bintmp = (fpointer * 10000 + 5)/10;
//fpointer = (double)bintmp / 1000;

 if(s)
   fpointer *= -1;

 return (fpointer);
}
發佈了26 篇原創文章 · 獲贊 39 · 訪問量 9萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章