{
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);
}