C语言和C#语言中,对于浮点类型的数据采用单精度类型(float)和双精度类型(double)来存储,float数据占用32bit, double数据占用64bit, 无论是单精度还是双精度在存储中都分为三个部分: 首先说一下原,反,补,移码. 移码其实就等于补码,只是符号相反. 对于正数而言,原,反,补码都一样, 对负数而言,反码除符号位外,在原码的基础上按位取反,补码则在反码的基础之上,在其最低位上加1,要求移码时,仍然是先求补码,再改符号.
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处理
其中float的存储方式如下图所示:
而双精度的存储方式为:
2 精度 float和double的精度是由尾数的位数来决定的。浮点数在内存中是按科学计数法来存储的,其整数部分始终是一个隐含着的“1”,由于它是不变的,故不能对精度造成影响。 float:2^23 = 8388608,一共七位,这意味着最多能有7位有效数字,但绝对能保证的为6位,也即float的精度为6~7位有效数字; double:2^52 = 4503599627370496,一共16位,同理,double的精度为15~16位。 注:本文在写作过程中,参照了如下资料: http://blog.csdn.net/ganxingming/archive/2006/12/19/1449526.asp |