float的精度及其取值范围

本文详细介绍了浮点数float在计算机中的存储方式,包括符号位、指数部分和小数部分的组成。通过一个实例展示了如何将6.5转换为float存储,并解释了指数部分使用偏移量127的原因,以及浮点数指数取值范围的限制。此外,还讨论了浮点数0的特殊表示和正负无穷大、NaN的表示。
部署运行你感兴趣的模型镜像

float的存储方式

float在计算机中是用科学计数法的形式来存储的,科学计数法的表示方式是a.b*10^c,因为计算机中是用二进制来存储东西的,只有0和1这两个数,并且最大数为1,所以float的科学计数法为(+-)1.b*2^c,所以计算机只需要存储三部分就可以了(+-,b,c)

float的存储的空间是4字节(32位bite),由符号位(1bite)、指数部分(7bite)、小数部分(32bite)。

1.Sign(1位):用来表示浮点数是正数还是负数,0表示正数,1表示负数。

2.Exponent(8位):指数部分,即上文提到数字c,取值范围为(-127)-128。

3.Mantissa(23位):小数部分,也就是上文中提到的数字b。

float存储示例

以数字6.5为例,看一下这个数字是怎么存储在float变量中的:

1.先来看整数部分,模2求余可以得到二进制表示为110。

2.再来看小数部分,乘2取整可以得到二进制表示为.1。

3.拼接在一起得到110.1然后写成类似于科学计数法的样子,得到1.101 x2^2。

4.从上面的公式中可以知道符号为正,尾数是101,指数是2。

5.符号为正,那么第一位填0,指数是2,加上偏移量127等于129,二进制表示为10000001,填到2-9位,剩下的尾数101填到尾数位上即可。

6.内存中二进制数01000000 11010000 00000000 00000000表示的就是浮点数6.5

这样说明一个问题,为什么指数部分要加上偏移量127,而不用byte存储类型来表示。

偏移量是什么?
叫移码.
使用偏移量的意义何在?
浮点数指数大小的比较结果变得显而易见. 
为什么呢?
因为负数的原码,反码,补码比正数的原码,反码,补码要大.
当直接比较两个浮点数指数大小时,会用一个1xxxxxx 来跟一个0xxxxxxx来比较,所以从表面看负数反而比正数大,这明显不是人类想要的结果,但如果引入偏移量127(0111 1111),很容易比较出大小,我们下面来举几个例子。

十进制原码        原码                  移码                  float指数           十进制指数

0                  0000 0000             0111 1111          0111 1111               0

1                  0000 0001             0111 1111         1000 0000              1

2                  0000 0010             0111 1111         1000 0001               2

                                ----------------     

127              0111 1111              0111 1111         1111 1110               127

128             1000 0000              0111 1111         1111 1111               128

-1                1000 0001              0111 1111         0000 0000              -1
那为什么偏移量选127呢? 

移码就是真值加2^n构成的,8位移码表达0~255,所以表达的真值就是-128~127(真值+128变成对应的移码,1000 0000规定为-128(byte))
我们再来看一下float这个浮点数,23位尾数是原码表达,用来表达小数点后23位。那我们来考虑,浮点数怎么取到0,刚好0而不是近似0。注意,最小正值只能到2^(-126),因为就算尾数全取0,前面还有一个隐藏位的1在啊,就算阶数取到最小,也是近似0而不是真正的0。所以IEEE那帮人就想了,那直接规定让阶数等于0的时候,隐藏位的1也变成0算了。
所以阶数全0,尾数全0,实际上是在表达0点。所以回到移码对应的真值数,我们发现-128表示不出来了,现在阶码的真值范围变成了-127~127。所以偏移量最大只能到达127,而不是128。
那么阶码127,真值为(127-127=0)的时候表示的是什么?当然就是1.m(尾数自己本身)。
很遗憾告诉你们一件事,刚刚的-127~127只是在移码的理想情况下证明为什么偏移量只能取127。实际上阶码的真值,也就是2的指数取值范围还要更小--只有(-126~127),为什么呢?因为还有一个数(阶数全1)被用作浮点数表达正负无穷大和NaN了。阶数全1,尾数全0表达无穷大(正负性看数符),阶数全1,尾数不为0,是NaN。

您可能感兴趣的与本文相关的镜像

Llama Factory

Llama Factory

模型微调
LLama-Factory

LLaMA Factory 是一个简单易用且高效的大型语言模型(Large Language Model)训练与微调平台。通过 LLaMA Factory,可以在无需编写任何代码的前提下,在本地完成上百种预训练模型的微调

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值