酒鬼z

我自将心向明月,独卧沙场醉圆缺

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

参考:http://www.gnu.org/software/libc/manual/html_node/Infinity-and-NaN.html

 参考:http://zh.wikipedia.org/zh-cn/IEEE_754

 

截取1:


关于32位浮点数的结构,你可以看我的btlog当中的描述部分   
  http://btlog.csdn.net/happy_888   
  根据IEEE的标准,浮点数的定义如下   
                            符号位       指数位               小数部分           指数偏移量     
  单精度浮点数   1   位[31]   8位   [30-23]     23位   [22-00]   127     
  双精度浮点数   1   位[63]   11   位[62-52]   52   位[51-00]   1023     
  我们以单精度浮点数来说明:   
  符号位,表述浮点数的正或者负   
  指数实际也有正负的,但是没有单独的符号位,而是采用了一个偏移来表示   
  在计算机的世界里,进位都是二进制的,指数表示的也是2的N次幂   
  这个数据格式当中的,指数是8位,可表达的范围是0到255   
  而对应的实际的指数是-127到+128   
  这里特殊说明,-127和+128这两个数据在IEEE当中是保留的用作多种用途的   
  -127表示的数字是0   
  128和其他位数组合表示多种意义,最典型的就是NAN状态   
    
  小数部分,并不是一个浮点数的实际的小数   
  实际的小数在这个小数前面还保留了一个1   
  拿浮点数1.0来说   
  符号位是0,   实际指数是0,对应这里的指数就是127了,也就是0x7f   
  而小数部分就是1.0了,   1是暗含的不存储,实际的小数部分就是0了   
  因此组合起来的数据就是,0x3f80000   
    
  16位的也是类似的,自己分析一下   
  WORD   w   =   *((WORD*)(&f))   
  是把一个浮点数按照内存结构转化成为一个unsigned   int   16位的结构   
  TC   2.0不是C++   ,是c++的话就可以简单   w   =   (int&)   f;   就可以了

 

截取2:

long类型可以隐式转换为float类型。
隐式转换也叫自动类型转换,即当我们要将一个变量类型中的值赋给另外一种类型的变量时,如果被赋值的变量字节大小大于准备赋值的变量字节大小,就可以自动转换成被赋值的变量类型。

但是这里long是8个字节,而float是4个字节,为什么反而能隐式转换呢?

两者表示数据的方式不一样,float采用IEEE的表示法,而long是用位数来控制的范围。
long和float从根本上讲它们表示的不是一类数,前者是精确值,而后者是非精确值。
float的字节宽度没有long大,但它的表现值宽度要宽得多,因此long到float是没有问题的。
long   -9.2*10^18     ~~     9.2*10^18
float   -3.4*10^38     ~~   3.4*10^38
可以看出来float表示的范围要比long的范围大,尽管float的位数少。
所以,占用内存多不表示它允许的取值范围大,long隐式转换成float只可能发生精确度下降,但不会导致数据丢失。

posted on 2013-05-22 18:54  酒鬼z  阅读(288)  评论(0)    收藏  举报