在IEEE754标准下浮点数如何用二进制数表示以及为什么用移码代替补码

在IEEE754标准下浮点数如何用二进制数表示以及为什么用移码代替补码

一、浮点数用二进制数表示
1、补充:十进制数0.4如何转化为二进制数0110 0110(0110循环)
float精度有限精确到6~7位
2、、

在IEEE754标准下浮点数如何用二进制数表示以及为什么用移码代替补码_第1张图片

在IEEE754标准下浮点数如何用二进制数表示以及为什么用移码代替补码_第2张图片

符号位,位于存储浮点数的最高比特位,且只占1比特。0表示正数,1表示负数。通过改变该比特位的值可以改变该浮点数的符号
指数位
小数

十进制数0.1562510 写成二进制的形式为0.001012
在IEEE 745标准下,我们用三部分来表示一个浮点数:
sign = 0, 因为该浮点数为正数(用1表示负数);
真实的指数是-3,但是我们用来存储的指数要在真实的指数上加上偏移量。在单精度浮点数中,这个偏移量是127,在双精度浮点数中这个偏移量是1023;所以我们这里用来存储的指数应该为(-3+127),即124。
最后结果如上图

当阶码二进制位不全为0,也不全为1时,N为规格化形式。(小数点左边是1)
当E的二进制位全部为0时,N为非规格化形式
当E的二进制位全为1时为特殊数值。

二、为什么用移码
移码:补码的符号位取反
1、容易判断阶码的大小,移码可用于简化浮点数的运算:例如:十进制数21,对应的二进制数为+10101,则其补码为0 10101,十进制数-21,对应的二进制数为-10101,则其补码为101011
因此,从代码形式看,符号位也是一位二进制数。按6位二进制代码比较大小的话,会得出101011>010101,这与实际大小恰好相反。
如果对每个真值加上2的n次方(n为上述真值中除去符号位后的位数),会得出
10101+100000=110101
-10101+100000=001011
再比较它们的大小会得出110101>001011,这样一来6位代码本身就可以看出它们的大小
2、0的特殊作用:0:表示指数为负无穷大,相当于分数分母无穷大,整个数无穷接近0,在尾数也为0时可用来表示0,尾数不为零表示未正规化的数
max:表示指数正无穷大,若尾数为0,则表示浮点数超出表示范围(正负无穷大);尾数不为0,则表示浮点数运算错误

移码是对于某一个系列或集合的数使它们都映射到正数轴上去,即在数轴上把数都统一往右移动n位,使得所有的数都不为负数。这里我们有E=e+01111111,所以对于所有的E有E大于等于0。这里的话,由于E都不为负数,所以我们直接可以由移码的表示形式看出对应数值的大小(这里是把移码当做无符号数来比较大小的,而不必考虑符号,这里比用补码好多了,补码是要变换成原码再比较的)。其次,用移码表示的话,简化了对于“0”的判断,即当移码的各位都为0的话,那么该移码对应的数据是能够表示的数据中的最小值。此外, 用移码来表示阶码的话可以提高表示数据的精度。如果不是采用移码来表示阶码的话,那么当阶码就会出现负值,这样的话当需要把该数据转换成非阶码浮点数据时我们将就需要对尾数进行左移(做乘法运算),这样的话我们会发现最先移去的是尾数的高位,因此这种方法不利于数据的精度表示。而对于才用移码表示阶码的话,我们在转换时是做右移操作,这样最先移去的是最低位,这样比较好地保持了数据的精度。

你可能感兴趣的:(在IEEE754标准下浮点数如何用二进制数表示以及为什么用移码代替补码)