关于用二进制科学计数法表示float型数据的笔记

//从本人空间日志搬运而来

//2017-10-25 22:01

首先先说一下今天的重难点吧

        老师讲的那个东西,我这里就把它形容为用二进制科学计数法表示float浮点数据

        相信大家对10进制的科学计数法都很了解,而老师给出的式子是2x×1.y,这里我们只要换一下位置,换成1.y×2x。是不是熟悉多了?10进制里1.y是属于1到10的,二进制自然是一到二。

        理解了这个式子的含义,下一步就是把它用float浮点数据类型表示出来,也就是存储到计算机里的形式。

        这里插一张图

        大家都清楚float数据类型占4个字节,也就是32位。而double是64位(8字节),所以精度会更高。float数据类型这32位里第一位是表示符号,1为负,0为正。后面8位是指数位(阶码),也就是x的二进制表达(补到8位)。最后是小数位(尾数),也就是y的二进制表达(补到23位)。double型数据里的x,y分别为11位,52位。其实如果不看符号位,把x,y倒过来,就是我们熟知的科学计数法形式了。

        我们给出一个浮点型数据:129.96(>1)

        首先分离出一个2的最大次幂,也就是128,2的7次幂,x=7,也就是00000111。怎么理解呢,可以想成是把原数的整数部分拿出来化为二进制,然后取最高位。

        剩下的1.96,就是2的7次方乘以0.y。

        先把1拿出来。这里把y化为二进制,具体方法老师上课有讲,就是乘以2然后有一取1,没1取0。取的位数为23-x。具体过程不赘述,最后的结果为1.11110101...(小数点后取23-x位)。最后根据之前拿出来的2的幂次,向左移动小数点。类比到10进制科学计数法很好理解,10的指数为几则往左移几位。

        但这里的x还不是最终的x,还得加128。个人认为这是防止原数小于1,x为负的情况(即保证x为正)。

        原数>0,符号位为0。

        最后结果为:0 10000111 00000011111010111000010

        我们在给一个例子:0.073(<1)

        这里的x就为负数了,一个一个顺:2的-1次幂,2的-2...  有2的-4次幂,0.0625。剩下0.0105,一样的方法,乘以二一次一次乘。这里的x为-4,我们就取23+4=27位。最后结果为.000000010101100...我们再把小数点往右移4位,得到.00010101100...(应该是23位)。

        符号为正取0,x=-4+128=124也就是01111100。

        最终结果:0 01111100 00010101100000010000010

        最后在挂两个链接,有兴趣的同学们可以瞅瞅:
        1.原码,补码,反码详解
         http://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html ;

        2.float浮点数的二进制存储方式及转换
        http://blog.csdn.net/rayxp/article/details/40855665
        有问题请在评论区留言,一起交流学习。上面只是一个大一新生的一些不成熟的总结跟猜想假设。 

猜你喜欢

转载自blog.csdn.net/qq_39586345/article/details/79580948