什么?计算机也会算错数?
2015-11-03 08:55:22 | 来源:玩转帮会 | 投稿:佚名 | 编辑:小柯

原标题:什么?计算机也会算错数?

人们通常不会怀疑计算机在数学计算上的结果,毕竟,如果连数都算不对,那还叫什么“计算机”啦?其实,有个简单的题目就能让计算机算错,不信我们试试看。

如果你用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),按下回车,看看结果是什么?

什么?计算机也会算错数? - 新闻资讯 | 玩赚乐 1

矮马,吓死本宝宝了,明眼人一看就知道算错了是吧?10个0.1加起来应该等于1啊!不过如果你试一下“0.1*10”,咦,这次结果又对了!这什么鬼?好吧,放心,你的电脑没坏,我们来看看这到底是怎么回事。

稍早接触计算机的那一代人几乎都知道计算机的内部运算都是以二进制来进行的,然而现在的用户恐怕早就不关心这件事了。自从冯·诺依曼提出现代计算机架构以来,几十年了计算机的原理都没有什么根本性的变化。我们人类在日常生活中通常使用十进制,有一种说法认为这是因为人有10个手指,但在电路设计上要表示10个状态可就相当困难了,不过很多元件都可以很容易地表示两个状态,比如开和关,电平高和低,因此采用二进制对于计算机来说是一个最方便的设计。而正是因为人类和计算机使用的进制不同,因此在进行计算时,就必然会涉及到进制的转换,也就是说,我们在屏幕上输入的是十进制的数字,然后计算机要将它转换成二进制进行计算,然后再把计算的结果转换成十进制显示出来。之所以上面那个题目计算机会算错,本质上说就是二进制惹的祸。

要搞清楚这个问题,我们先来理解一下进制的概念。在十进制中,一位数字我们可以使用0到9,比9多的时候就会变成10,这就是一个两位数了,也就是进位了,二进制也是一样,只不过一位数字只能使用0和1,再多就要进位了。那么进制的本质又是什么呢?我们随便拿一个十进制的数字来看一看:

什么?计算机也会算错数? - 新闻资讯 | 玩赚乐 2

看懂了没?一个十进制数实际上就是其中每一位数依次乘以10的0、1、2…次幂(权重),然后再把结果加起来,那么以此类推,二进制里面就是把上面的10换成2呗?我们来看一个:

什么?计算机也会算错数? - 新闻资讯 | 玩赚乐 3

于是二进制数1001也就是十进制数的9。到这里似乎还没什么问题,因为我们只讨论了整数呢,每一个十进制整数都可以转换成一个二进制整数,反过来,每一个二进制整数也都可以转换成一个十进制整数。不过,如果把小数也加进来呢?先看一个十进制的小数:

什么?计算机也会算错数? - 新闻资讯 | 玩赚乐 4

看懂了没?其实就是把10上面的指数变成了负数而已,不难吧。那么以此类推,二进制的小数也就是把10换成2呗,我们来看一个:

什么?计算机也会算错数? - 新闻资讯 | 玩赚乐 5

上面我们理解了进制的一些本质特性,算不过来也没关系,我们暂且先不管它,不过,这跟我们遇到的问题到底有什么关系?别急,我们再看一下当引入小数之后,进制之间的转换到底出了什么bug。我们知道实数的数轴是连续的,每两个数字之间的部分是可以被无限分割的,举个例子,0和1之间的这部分,如果用十进制一位小数来分割的话,可以分成10份,也就是0.1、0.2、0.3……0.9、1,如果用二进制一位小数来分割的话,则只能分成两份,也就是0.1(十进制的0.5)、1。你发现了什么问题?无论小数点后面增加多少位数字,二进制永远只能以2来分割数轴,而十进制则是以10来分割数轴。

让我们回想一下小学的数学知识,在十进制中,如果要用有限小数来表示一个分数的值,那么这个分数的分母(化简之后)一定不能包含除了2和5以外的其他质因数,因为十进制以10来分割数轴,而10分解质因数的结果为2×5。举个例子:1/8、1/10、1/25都可以换算成有限小数(分别是0.125、0.1、0.04),因为这些分数的分母分解质因数之后只包含2或者5(8=2×2×2、10=2×5、25=5×5),而当分母包含其他质因数时,例如1/3、1/7、1/18这些则无法用有限小数来表示(也就是俗话说的“除不尽”)。如果我们把这个规律套用到二进制上会怎么样呢?2本身就是一个质数,无法分解质因数了,因此在二进制中,如果要用有限小数来表示一个分数的值,那么这个分数的分母一定只能包含2这一个质因数,换句话说,分母必须为2的幂(2、4、8、16、32……)。

好了,我们回头看看开头的题目,0.1换算成分数就是1/10,而1/10的分母是10,10并不是2的幂,因此,在二进制中并不能用有限小数来表示1/10这个值。事实上,如果将0.1转换成二进制,我们会得到一个无限循环小数:0.000110011001100……看到这里,很多人估计已经想明白了,没错,计算机的精度是有限的,并不能直接处理无限小数,对于无限小数必须要截短到某个位置把它变成有限小数,但截短之后这个数就不准了,必然就产生了一点误差,而连续加10次会将这种误差放大,当误差被放大到一定程度时,计算的结果就会出问题了,于是我们就看到了开头的那一幕。如果用十进制来类比的话,大家可以想象一下,1/3+1/3+1/3=1,但1/3只能用无限循环小数来表示,即0.333333……,如果我们将它截短到某一位,假设截到0.333,那么0.333+0.333+0.333=0.999,你看,同样也会出问题。

问题的原因总算搞清楚了,不过感觉很坑爹啊,计算机居然算不准小数,但为什么平时大家很少因此遇到问题呢?那是因为大多数用户都不用编写程序,但对于整天编写程序的程序员来说,这样的问题其实经常遇到。比如说,如果你在一段程序中需要让计算机判断0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1+0.1是否等于1,计算机会告诉你不等于1,坑爹吧?如果这段程序涉及到算钱,有时候就会错得很离谱,因此有经验的程序员在碰到小数计算的时候都会特别小心。当然,作为一般用户我们平时根本不需要关心这样的问题,不过计算机居然会算错数,怎么想都觉得挺奇妙的吧?

tags:

上一篇  下一篇

相关:

这就是为什么在你快要睡着时会突然的抽搐一下

能好好睡觉是世上最令人满足的事之一,去问问任何一个睡眠品质超好、超快睡着的人就知道了!也许你常常失眠

珍妮佛以毒攻毒免于崩溃

珍妮佛劳伦斯主演的《饥饿游戏:自由幻梦 最终章》是该系列4部曲的完结篇。(美联社) 珍妮佛劳伦斯自从

BMI指数真的很准确吗?其实只要一根绳子就能测出你的身体是否健康

身体质量指数 (BMI) 长久以来都是医生们用来评断一个人的体重健康与否的标准,但是,最新的研究指出,这个指

女人身上为什么会有撩人的体香?

问:为什么女生有体香,男人没有?答曰:化妆品腌入味了有人说“体香”这种技能是天生自带的,是神族技能,

6个关于“钻石”的扯淡真相

在我们这时代,钻石被誉为最受欢迎的宝石。但早在钻石被发掘之前,蓝宝石与红宝石才是大家争相要拥有的宝石

10款被诅咒过的“死亡车祸率最高”的汽车

美国高速公路保险协会针对了2009到2012年的每个车款生产数量与车款车祸的事件量做比较,总结出下面这10辆最

12个名人最怪异的饮食法则,是不是都很变态?

1. 史蒂芬·乔布斯 (Steve Jobs)有一次连续几个礼拜,乔布斯只吃一种类型食物,就是苹果和胡萝卜。据悉,他

人体这些部位,还是“脏”点好?

现代社会,人们对健康越来越关注。关注健康的表现之一,就是注重个人卫生。灰尘、细菌、病毒、分泌物,最好

厨房里有这些趁手的小工具,帮你做出好吃的面包

今天就不复述一些烘焙必要的器具了:比如烤箱,钢盆,容器,烤盘,比如和面机(没有的话就手揉呗),再比如

在“网易有道”和“阿里淘宝”的思考-toB的产品经理和toC的产品经理有什么差别?

在网易有道做过用户型产品,淘宝网to c,to b的产品都有尝试。9月份结束阿里的暑期实习,在火车上对自己体会

站长推荐: