人们通常不会怀疑计算机在数学计算上的结果, 毕竟, 如果连数都算不对, 那还叫什么“计算机”啦?其实, 有个简单的题目就能让计算机算错, 不信我们试试看 。
如果你用Chrome浏览器的话, 按下F12(在Mac上要按Command+Option+I)可以打开一个“开发者工具”窗口, 然后点上面的“Console”标签, 你会看到一个控制台窗口, 在里面输入“0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1”(一共10个0.1), 按下回车, 看看结果是什么?
【什么?计算机也会算错数?】
文章插图
矮马, 吓死本宝宝了, 明眼人一看就知道算错了是吧?10个0.1加起来应该等于1啊!不过如果你试一下“0.1*10”, 咦, 这次结果又对了!这什么鬼?好吧, 放心, 你的电脑没坏, 我们来看看这到底是怎么回事 。
稍早接触计算机的那一代人几乎都知道计算机的内部运算都是以二进制来进行的, 然而现在的用户恐怕早就不关心这件事了 。 自从冯·诺依曼提出现代计算机架构以来, 几十年了计算机的原理都没有什么根本性的变化 。 我们人类在日常生活中通常使用十进制, 有一种说法认为这是因为人有10个手指, 但在电路设计上要表示10个状态可就相当困难了, 不过很多元件都可以很容易地表示两个状态, 比如开和关, 电平高和低, 因此采用二进制对于计算机来说是一个最方便的设计 。 而正是因为人类和计算机使用的进制不同, 因此在进行计算时, 就必然会涉及到进制的转换, 也就是说, 我们在屏幕上输入的是十进制的数字, 然后计算机要将它转换成二进制进行计算, 然后再把计算的结果转换成十进制显示出来 。 之所以上面那个题目计算机会算错, 本质上说就是二进制惹的祸 。
要搞清楚这个问题, 我们先来理解一下进制的概念 。 在十进制中, 一位数字我们可以使用0到9, 比9多的时候就会变成10, 这就是一个两位数了, 也就是进位了, 二进制也是一样, 只不过一位数字只能使用0和1, 再多就要进位了 。 那么进制的本质又是什么呢?我们随便拿一个十进制的数字来看一看:
文章插图
看懂了没?一个十进制数实际上就是其中每一位数依次乘以10的0、1、2…次幂(权重), 然后再把结果加起来, 那么以此类推, 二进制里面就是把上面的10换成2呗?我们来看一个:
文章插图
于是二进制数1001也就是十进制数的9 。 到这里似乎还没什么问题, 因为我们只讨论了整数呢, 每一个十进制整数都可以转换成一个二进制整数, 反过来, 每一个二进制整数也都可以转换成一个十进制整数 。 不过, 如果把小数也加进来呢?先看一个十进制的小数:
文章插图
看懂了没?其实就是把10上面的指数变成了负数而已, 不难吧 。 那么以此类推, 二进制的小数也就是把10换成2呗, 我们来看一个:
文章插图
上面我们理解了进制的一些本质特性, 算不过来也没关系, 我们暂且先不管它, 不过, 这跟我们遇到的问题到底有什么关系?别急, 我们再看一下当引入小数之后, 进制之间的转换到底出了什么bug 。 我们知道实数的数轴是连续的, 每两个数字之间的部分是可以被无限分割的, 举个例子, 0和1之间的这部分, 如果用十进制一位小数来分割的话, 可以分成10份, 也就是0.1、0.2、0.3……0.9、1, 如果用二进制一位小数来分割的话, 则只能分成两份, 也就是0.1(十进制的0.5)、1 。 你发现了什么问题?无论小数点后面增加多少位数字, 二进制永远只能以2来分割数轴, 而十进制则是以10来分割数轴 。
推荐阅读
- 秋葵是什么
- 如果移民火星,我们能吃什么?
- 秋葵是什么季节播种的
- 百香果榨汁配什么水果好喝,这6种搭配方法可美白养颜
- 金毛什么时候开始训练
- 金钻怎么施肥,施什么肥-
- 春节家里摆什么花最好:年花的品种有哪些
- 陶器是什么时候发明的?
- 固执!为什么有的人不撞南墙不回头?
- 什么?他们在万圣节雕的居然不是南瓜?