通过阅读《程序是怎样跑起来的》第三章,我对于计算机处理数据有了进一步的了解。在第二章中我对于计算机使用二进制处理数据仅仅停留在处理整数部分,而在第三章,我认识到了计算机对于小数部分的处理。
在书中说计算机处理小数部分往往会出错,阅读后我知道了其缘由,我认为及其根本是因为计算机使用二进制处理数据,而二进制又无法表示全部的小数,因为,在固定位数的小数中,二进制0与1的“组合情况”无法表示全部小数,而且二进制的运算法则是从左至右位权增加,所对应的十进制数也就越大。比如00000001就表示1而00000010就表示2,在小数这一方面也是通用的,因此小数部分是无法用二进制表示完全的,所以计算机对于小数的运算也并非完全精确的。相反,十进制数转化为二进制数会出现无限循环这一情况,因此计算机会截取片段以达到近似值。但是又存在一个问题就是例如1011.10101这种表现形式,计算机无法识别这是哪一个十进制数,因此就引出了浮点数这一概念。在我所学的JAVA中浮点数分为单精度和双精度,在阅读完本章后我对此有了初步的理解,浮点数作为专门表示小数的数据类型,在计算机中采用符号+尾数×基数的指数次幂的形式,其中尾数部分是将整数部分变为1(通过逻辑右移来实现)后的二进制数并且会根据单/双精度的位数来补0,,指数部分是EXCESS系统,EXCESS系统就是将对应位数的最大值的中间值作为0,1表示+1,-1表示-1.如此如此来将指数用二进制表示出来,并暗中进行计算。如8位二进制数的最大值位11111111(十进制255),那么01111111(127)所对应的就是0,128就是1即转化为10进制就是1次幂(128-127)。因此可以用符号+尾数×基数的指数次幂来表示浮点数了,如此计算机就用浮点数来表示小数来运算了。同时我们可以用其他思路来计算小数,如先变为整数来运算,最后在除扩大的倍数即可,如此可以避免计算出错。