怎么工作 计算机 怎么存负数和小数
到目前为止,我们存的只是0、1、2这样的正整数。那零下5度、负的余额、3.14这样的数,又怎么用0和1来存呢?这里有两个巧妙的办法。
把最前面的开关当作符号
存负数的第一个想法很简单。
拿出一个开关,专门用来表示符号。
最前面一位是0就表示正数,是1就表示负数,其余的开关用来表示大小。
最前面一格是符号,其余几格表示大小。
只改最前面一格,+5就变成了-5。
简单是简单,但有不方便的地方。
每次计算都得单独照顾符号,而且还会出现两个0。
也就是+0和-0。
绕一圈来表示负数
所以计算机实际用的办法更巧妙一些。
想想汽车的里程表就明白了。
从9999再走1,就会回到0000。
反过来,从0减1,就会绕回到最后一个数。
利用这一点,人们把最后面的那些数拿来表示负数。
同样的位,绕过一圈的部分就读成负数。
这种方法叫作补码(二进制补码)。
好处是加负数时也只要照常相加,加法电路自己就能得出正确答案。
不用另做减法电路,所以计算机选了这种方法。
小数点是浮动的
接下来是3.14这样的小数。
秘密就藏在名字里:小数点不是固定在一个位置,而是浮动的。
同样的数字,小数点点在哪里,就能表示大数或小数。
下面可以在314这几个数字之间移动小数点。
移动小数点,同样的数字就变成不同的值。
小数点往左移,数就变小;往右移,数就变大。
正因为小数点能这样浮动,从很大的数到很小的数都能用同一种方式存下来。
所以叫作浮点数,也就是浮动的小数点。
拆成符号、小数点位置和数字
那么浮点数怎么用0和1来存呢?
把开关分成三个区。
最前面是刚才讲的符号,中间是小数点的位置(数有多大),剩下的是实际的数字。
把开关分成三个区来存。
有了这三块,不管小数点在哪里,任何数都能写成0和1。
这和科学课上用的科学记数法是同一个思路。
就像把3.14拆成0.314乘10一样。
计算机有时存不准0.1
最后讲一个有趣的事实。
让计算机算0.1加0.2,有时得不到正好的0.3。
会差那么一点点,因为0.1没法用0和1不多不少地存下来。
在我们眼里是0.3,计算机里却留着很小的误差。
用十进制写1除以3,会得到0.3333...这样没完没了的数。
在0和1的世界里,0.1也是这样没完没了的数。
所以只能在某处截断,很小的误差就是从那里来的。
这不是计算机算错了,而是用0和1存小数这种方式本身的局限。