关于浮点型数据的存储方式和精度

关于浮点型数据的存储方式和精度

众所周知,在C语言中float类型的数据在内存中占据4字节,而double类型的数据在内存中占据8字节,那么这两种浮点型数据是如何存储和读取的呢?其实无论是float类型的数据还是double类型的数据,在内存中存储都是分为3部分,即:符号位、阶码与尾数。
我们先来看看float类型数据的存储方式,double类型数据的存储方式基本相同。C语言标准规定:float数据占4字节空间,其中符号位是1bit,阶码是8bit,尾数是23bit,当符号位为0时,表示正数,为1时表示负数。而阶码是8bit,表示的数字范围是:0—255,但是阶码肯定有正有负,因此C语言标准规定float类型的数据阶码偏移量为127,这样表示的数字范围是:-127—+128。对于任意一个浮点型的数据来讲,我们都可以将其写为1.xxxxxxx * 2的阶码的形式,举个例子:3.25可以写为1.1012^(+1)。C语言标准规定,自动省略最前面的1,把小数点后面的二进制存储在尾数部分,空余的后续尾数自动补0即可。
下面我们来看个存储例子:刚才上面的3.25=1.101
2^(+1),因为是正数,所以符号位为0,而阶码为+1,加上偏移量127,最后阶码为128,也就是1000 0000,而尾数部分,省略掉最前面的1,后面的数字为101,后续的20位自动补0,最后3.25在内存中的存储形式为:0 10000000 10100000000000000000000。
既然我们了解了浮点型数据的正常存储格式,下面我们来看看一些特殊情况,主要分为3种情况:
(1)阶码的8bit全部为0,此时真实的阶码为-127,但是C语言标准规定,如果阶码的8bit全部为0,尾数部分隐藏的1无效,也就是自动省略1的机制无效了。因此我们如果还原数据,就是0.xxxxxx* 2^(-127)的数字,这样做是为了表示0和接近0的很小的数字。
如果尾数部分全为0,无论符号位是正还是负,都表示数字0,如果尾数部分不全为0,表示非常接近0的正负数。
(2)阶码的8bit全部为1,此时真实的阶码为+128,但是C语言标准规定,如果阶码的8bit全部为0,尾部部分也全部为0,则根据符号位的正负从而表示正负无穷大,如果尾数部分不是全部为0,表示这不是一个有效的数字,没有实际意义。
(3)阶码的8bit既不是全为1,也不是全为0,这是最正常的情况,按照刚才讲过的存储原理进行分析即可。
根据上面罗列的3种情况,我们可以推断出float类型数据的表示范围是:
最大值:0 11111110 11111111111111111111111
最小值:1 11111110 11111111111111111111111
换算成科学计数法为:
最大值:1.11111111111111111111111 * 2^(+127)
最小值:-1.11111111111111111111111 * 2^(+127)
在这里插入图片描述
在这里插入图片描述

由于float类型数据的尾数部分为23bit,因此它的精度为2^(+23),虽然它还有一个隐藏的1,但是这个1是不会变化的,不能计入float类型数据的精度范围,换算成十进制的数字,float类型数据的精度范围为:8388608¬,也就是6位到7位之间。
有了float类型数据的存储原理和精度计算,相信大家也能推算出double类型数据的取值范围和精度,这里就不再重复赘述了,不足之处,请各位码友批评指正!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值