浮点型精度理解及存储原理理解
2017-11-19 00:35
246 查看
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 是它的小数部分最小值之间的差值,即为精度
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 是它的小数部分最小值之间的差值,即为精度
相关文章推荐
- 三分钟理解Java中字符串(String)的存储和赋值原理
- 浮点型数据在计算机内存中存储原理
- 三分钟理解Java中字符串(String)的存储和赋值原理
- 三分钟理解Java中字符串(String)的存储和赋值原理
- 三分钟理解Java中字符串(String)的存储和赋值原理
- 理解Java中字符串(String)的存储和赋值原理
- 三分钟理解Java中字符串(String)的存储和赋值原理
- 理解Java中字符串(String)的存储和赋值原理
- 理解变量在内存的存储原理
- 深入理解PHP原理之Global关键字
- ceph存储 多网卡的7种bond模式原理
- 软件测试行业的个人理解 6 - 浅谈自动化测试原理
- 理解模板引擎Razor 的原理(转载)
- 深入理解PHP原理之异常机制
- 理解HTTP session原理及应用
- Struts2拦截器原理理解
- 理解memcached的内存存储
- 二叉树 24点游戏(Ⅰ) (浮点型精度问题!!!)
- memcached全面剖析–2.理解memcached的内存存储
- java跨平台原理深刻理解