浮点型精度理解及存储原理理解

来源:互联网 发布:网络割接是什么意思 编辑:程序博客网 时间:2024/06/06 03:20
float 类型精度6到7位
double 类型精度15到16位
可能会有人会比较疑惑,我们慢慢分析。


首先解释下为什么叫浮点型
我们常常用,确容易被忽略的问题,明白这个,计算浮点型的精度和最小小数就简单了。


Ⅰ .简答原理
1.浮点型即为小数点可以浮动的数据类型
2.通俗的来讲就是2进制的科学计数法。所以浮点型有科学计数法的优点和缺点。


解释1:
什么是小数点浮动?
有小数点浮动 必然有小数点不浮动的数据类型。小数点不浮动就是约定了前多少位存储整数,后多少位存储小数。而浮动型即为固定的存储一个小数,同时用另外的空间记录小数点偏移的值。
解释2:
科学计数法更够更充分的利用存储空间,能够表示更大的数或者更小的小数。缺点是并不是直观的数,需要计算。


Ⅱ.下面具体分析浮点型:
以32位float类型为例


2进制的科学计数法
±(小数)×2ⁿ


32位 分成3个部分  即 (正负号:1位)(指数n:8位)(小数部分:23位)
1.正负号:1为负 0为正
2.指数部分:偏移值为127  及取值范围为 -127 --  +128
3.小数部分:隐藏了首位1


例如    1.10.25   =    1*2³  +  0*2²  +  1*2¹ +  0*2º  +  0*2^(-1)  +  1*2^(-2)
2.所以以2进制表示为:1010.01 
3.进制的科学计数法表示为:1.01001*2^3
4.指数位:因为偏移值为127 所以指数为取127+3=130即:01000110
5.小数位:去掉首位1 即:01001  后位补零:0100 1000 0000 0000 000
6.结果:0  01000110  0100 1000 0000 0000 000


一些解释:
为什么去掉首位的1呢?

因为除了0,首位都是1. 


那0怎么表示?
使用特殊值
当指数位为-127 或 128 及0000 0000 或 1111 1111
的时候不进行上述运算
1.指数位为-127的时候 指数仍以-126计算,小数部分首位不再补1
 即 (0或1)+(0)+(0)=0
     (0或1)+(0)+(小数)=(±)该小数*2^(-126)
(这样做有一个好处,即形成的渐进式下溢出,即0与绝对值最小数之间的距离==最小数与第二小数之间的距离(2^-23  *  2^-126),使得两个不相等的浮点数相减不等于0,在这之前绝对值最小的三个数依次为:0,  2^-126,  2^-126+2^-23*2^-126,所以两个不相等的浮点数差值可能为0)
2.指数为:127的时候
(0或1)(127)(0)==(正/负)无穷
(0或1)(127)(大于0)==NAN(标记为不是数字)


所以float类型精度为 2^-23 = 1.1920928955078 * 10 -7  所以大约在换算到10进制6到7位之间
注:1.精度不是指最小值(参考科学计数法),大于0的最小值为2^-23  *  2^-126
    2.精度在2进制中的表示准确为23位,1.1920928955078 * 10 -7 是它的小数
部分最小值之间的差值,即为精度
原创粉丝点击