IEEE754 C 语言代码

原创 2016年06月02日 08:28:44
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);
}
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

c语言中如何将以IEEE754标准显示的int型变量转换float型变量

int *p=a  p是一个指针变量,p变量存放的是一个地址,*p表示该地址里存放的数据,该语句表达的是,将a变量的值存放在p所指向的地址里去。 int *p=&a  表示p指针指向的是a的地址 那么...

IEEE754浮点格式简述 和 C语言基本数据类型转换实质

本人菜鸟,花了点时间研究了一下C语言的数据转换现象(还没弄出深层原因呢)。不知道C编译器原理,而编译原理,汇编,组成原理只学点皮毛。 以下是成果,欢迎指正和释疑。  //编译环境:INTEL T3...

C语言中浮点数的表示方法---浮点数表示引起的误差---IEEE 754关于浮点数的规定

一、表示方法 在计算机中,浮点数一般由三部分组成:符号位+阶码+尾数。 这种浮点数是用科学记数法来表示的,即:浮点数=符号位.尾数×2^阶码。 根据IEEE 754国际标准,常用的浮点数...

ieee754易语言源程序及DLL

  • 2016-06-16 20:56
  • 1.61MB
  • 下载

C语言IEEE754

  • 2012-12-16 10:41
  • 921KB
  • 下载

IEEE754 C++ float的内存布局.md

IEEE754标准中,浮点数的内存布局以下仅以float(内存中占据4个字节,32bits)来说明,double(8个字节,64bits)同理,只是有细微的差别。float的内存分布IEEE754规定...

基于IEEE754标准的Modbus浮点数转换程序实现

最近工作上需要实现一个基于Modbus协议的浮点数转换的过程,所以写了这么一个程序,目前仅支持32位的转换, 实现程序如下所示: /**********************************...

IEEE 754 double 编码为二进制

此文版权属于作者所有,任何人、媒体或者网站转载、借用都必须征得作者本人同意!    有些系统的 double 的 sizeof 不为 8,或者 double 在内存里的表示不是 IEEE 754 ...

解读IEEE标准754:浮点数表示

解读IEEE标准754:浮点数表示 如须转载请注明作者为soloforce@linuxsir.org,并请保持文章的完整和提供转载出处。 http://bbs.linuxsir.org/showt...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)