追逐理想
如果你了解我,你就会喜欢我
float double 存储问题

   C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用64bit, 无论是单精度还是双精度在存储中都分为三个部分:

  首先说一下原,反,补,移码. 移码其实就等于补码,只是符号相反. 对于正数而言,原,反,补码都一样, 对负数而言,反码除符号位外,在原码的基础上按位取反,补码则在反码的基础之上,在其最低位上加1,要求移码时,仍然是先求补码,再改符号. 

  1. 符号位(Sign) : 0代表正,1代表为负
  2. 指数位(Exponent):用于存储科学计数法中的指数数据,并且采用移位存储  

  A,阶码是用移码表示的,这里会有一个127的偏移量,它的127相当于0,小于127时为负,大于127时为正,比如:10000001表示指数为129- 127=2,表示真值为2^2,而01111110则表示2^(-1). 

有移码表示阶码有是有原因的,主要是移码便于对阶操作,从而比较两个浮点数的大小. 这里要注意的是,阶码不能达到11111111的形 式,IEEE规定,当编译器遇到阶码为0XFF时,即调用溢出指令.  总之,阶码化为整数时,范围是:-127~127.

float:   符号位1,阶码08(固定偏移     7F),尾数23,固定隐含位有 
double: 符号位1,阶码11(固定偏移   3FF),尾数52,固定隐含位有 
long   double:符号位1,阶码15(固定偏移3FFF),尾数64,固定隐含位无 
某些编译器中把long   double作double处理 
  1. 尾数部分(Mantissa):尾数部分

其中float的存储方式如下图所示:

float类型的存储方式


 单精度浮点数8.25的存储方式

 

而双精度的存储方式为:

 

 

double类型数据的存储方式 

 

     

 


 

 

2 精度

float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。

float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字;

double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。 

 

 

 

注:本文在写作过程中,参照了如下资料:

http://www.msdn.net/library/chs/default.asp?url=/library/CHS/vccore/html/_core_why_floating_point_numbers_may_lose_precision.asp

http://blog.csdn.net/ganxingming/archive/2006/12/19/1449526.asp

http://blog.csdn.net/hziee_/archive/2007/01/08/1477427.aspx

 http://blog.csdn.net/biblereader/article/details/819428

 

 

posted on 2010-09-08 10:09  人间奇迹  阅读(3407)  评论(0编辑  收藏  举报