【第22期】观点:IT 行业加班,到底有没有价值?

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语言实现 byte 转float IEEE754

C语言根据 IEEE754 实现 byte 转float

浮点数原理探究

今天听到实验室有人问道浮点数的实现机制,之前刚好研究过原码、反码、补码、移码的关系,而这类问题很底层,一般容易忽视。干脆打破沙锅问到底,彻底搞清楚这个问题并留下证据,于是就有了这篇博文。

浮点数与IEEE754

浮点数1.  什么是浮点数在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达方式中,小数点固定的位于实数所有数字中...

IEEE754浮点数的表示方法

1.浮点数的存储格式浮点数在C/C++中对应float和double类型,我们有必要知道浮点数在计算机中实际存储的内容。IEEE754标准中规定float单精度浮点数在机器中表示用 1 位表示数字的符...

浮点数的表示及范围 IEEE754

浮点数与IEEE754 浮点数 1.   什么是浮点数 在计算机系统的发展过程中,曾经提出过多种方法表达实数。典型的比如相对于浮点数的定点数(Fixed Point Number)。在这种表达...

IEEE754,浮点数的精度

http://zh.wikipedia.org/wiki/IEEE_754 IEEE二进制浮点数算术标准(IEEE 754)是1980年代以来最广泛使用的浮点数运算标准,为许多CPU与浮...

IEEE 754 浮点数的表示精度探讨

前言 从网上看到不少程序员对浮点数精度问题有很多疑问,在论坛上发贴询问,很多热心人给予了解答,但我发现一些解答中有些许小的错误和认识不当之处。我曾经做过数值算法程序,虽然基本可用,但是被浮点数精度问题...

IEEE754标准在表示浮点数

主要讲述是的IEEE标准的二进制浮点数表示:IEEE754标准在表示浮点数时,每个浮点数均由三部分组成:符号位S,指数部分E和尾数部分M。我们知道10进制数的科学计数法如A= -3.5×105 这里最...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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