今天看一些计算机基础,满屏的010101感觉双眼分辨率彻底花掉了,其中浮点数的二进制表达这里有点模糊记录一下自己的理解
目前业界流行的浮点数标准是IEEE754 , 该标准规定了4 种浮点数类型单精度、双精度、延伸单精度、延伸双精度。前两种类型是最常用的,
以单精度小数为例
例如:0.35 转换成二进制的话
0.35*2 = 0.7 取整数位 0
0.7*2 = 1.4 取整数位1
0.4*2 = 0.8 取整数位0
0.8*2 = 1.6 取1
0.6*2 = 1.2 取1
0.2*2 = 0.4 取0
0.4*2 = 0.8 取0
...
最终结果为01011001100110011001100110011001....
那么我们知道浮点数在计算机中是以科学计数法的形式表达的
- 符号位
在最高二进制位上分配1位表示浮点数的符号, 0 表示正数, 1 表示负数。- 阶码位
在符号位右侧分配8 位用来存储指数, IEEE754 标准规定阶码位存储的是指数对应的移码,而不是指数的原码或补码。根据计算机组成原理中对移码的定义可知,移
码是将一个真值在数轴上正向平移一个偏移量之后得到的。(好吧,其实我这一点根本就没懂纯粘过来的)。尾数位
最右侧分配连续的23 位用来存储有效数字, IEEE754 标准规定尾数以原码表
示。正指数和有效数字的最大值决定了32 位存储空间能够表示浮点数的十进制最
大值。指数最大值为i27 ;::: 1.7 × 1038 ’而有效数字部分最大值是二进制的1.11···1
(小数点后23 个1 ),是个无限接近于2 的数字,所以得到最大的十进制数为
2 × 1.7 × 1038 ’再加上最左l 位的符号,最终得到32 位浮点数最大值为3.4e+38 。
科学计数法进行规格化的目的是保证浮点数表示的唯性。如同十进制规格化的
要求1<= |a|<10 , 二进制数值规格化后的尾数形式为l.xyz ,满足1<= |a|<2。为了节约存储空间,将符合规格化尾数的首个1省略,所以尾数表面上是23 位,却表示
了24 位二进制数
问题就出在这里,我们将0.35转换成了01011001100110011001100110011001但我们如何表达呢?我感觉其实是很简单的,思路如下:
正数的符号位为 0
然后我们将01011001100110011001100110011001放入23位的尾数位中去,我们又知道有23位但其实是表达的24位有效数字,首位的1是省略的,为了拟合首位1省略,我们的数字变成了
0
1
01100110011001100110011
可以看到整个左移了两位,也就是说数值变大了,那我们转换的时候就要把放大的倍数除掉,那么根据阶码位的计算方式x-127=-2得出x=125,那么125的二进制表达是什么呢?
就是01111101
啦
所以拼起来就是
0 01111101 01100110011001100110011