单精度浮点数float在计算机中如何存储
【引言】
前天我有个朋友(字面意思)问了我关于字节码的一道题目,我发现这着实触及到了我的知识盲区,便找了些资料来看,看完了整型变量在计算机中的存储方式后我又顺藤摸瓜看了浮点数在计算机中的存储,然后在很多细节上就懵了,在看了不少人的博客后,整理了一些东西,以作备忘。
一、十进制的浮点数如何转化为二进制表示
1.方法
整数部分正常转化为二进制表示,小数点不动,小数部分不断乘以2取整数部分,然后将小数部分重复上述步骤直到小数部分为0为止。
2.例子
例:十进制17.625如何表示为二进制?
解1:首先是整数部分,十进制的17转化为二进制表示为 1 0001,小数部分为0.625,接下来计算小数部分的二进制表示。
0.625×2=1.25[1] 0.625 \times 2 = 1.25 \qquad [1] 0.625×2=1.25[1]
0.250×2=0.50[0] 0.250 \times 2 = 0.50 \qquad [0] 0.250×2=0.50[0]
0.500×2=1.00[1] 0.500 \times 2 = 1.00 \qquad [1] 0.500×2=1.00[1]
然后自上而下取得101,这就是小数部分的二进制表示。
因此最后的结果表示为 1 0001.101
解2:也可以用这样一种思想来进行二进制的转换,还是以17.625为例,可以小数点想象成数轴的零点,不过这个数轴是以左为正方向的,向左表示2的正数次幂,向右表示2的负数次幂。
那小数点右边的第一位就是2−12^{-1}2−1,也就是0.5。第二位就是2−22^{-2}2−2,也就是0.25,以此类推。我们又知道0.625=0.5+0.1250.625=0.5+0.1250.625=0.5+0.125,也就是可以得到0.625可以用二进制表示为0.1+0.001,因此0.625用二进制就可以表示为0.101。
因此17.625用二进制表示也就是 1 0001.101
二、float的表示方法
在这里会说明float的表示方法,如何将一个浮点型转换为计算机内的存储形式,指数位和尾数位的求法会分开说明。
1.float的存储形式
float类型的浮点数在计算机中用四个字节,也就是32个比特位来存储。不过这32位并不是每一位都用来表示数字大小的,而是将其分成了1+8+231+8+231+8+23三部分来表示,其表示法如下:
S⏟SignEEEEEEEE⏟ExponentMMMM⋅⋅⋅MMMM⏟Mantissa \underbrace{S}_{Sign}\underbrace{EEEEEEEE}_{Exponent}\underbrace{MMMM \cdot\cdot\cdot MMMM}_{Mantissa} Sign
SExponent

本文详细探讨了单精度浮点数float在计算机中的存储方式,包括如何将十进制浮点数转化为二进制,float的存储形式(符号位、指数位和尾数位),以及如何计算指数和尾数。此外,还讨论了float的真值、特殊值(0、无穷大)以及其表示范围。文章以17.625为例,深入浅出地解释了浮点数的计算过程。


被折叠的 条评论
为什么被折叠?



