程序员入伙书——两个世界

作为程序员,我们常往来于两个世界之间:计算机世界和现实世界。为了快速地让你感受到这两个世界的不同,我举一个例子。请在Python(啥?)的“>>> ”提示符后输入这样一行:

int(0.7 / 0.1)

现在先不要按Enter(回车)键,停下来,听我解释一下:这句话意思是,计算0.7除以0.1所得的商,取其整数部分。这个简单的除法,你觉得结果会是什么?

7,对吧?现在,敲回车,看看计算机认为结果是什么。

>>> int(0.7 / 0.1)
6
>>>

😮 😮 😮

为了弄清楚这个6是怎么出来的,我们先把“取整数部分”去掉,只留下0.7 / 0.1——如果你曾经听说过“调试”这个词,我们现在就是在调试:

>>> 0.7 / 0.1
6.999999999999999
>>>

现在我们至少可以理解,为什么“取整数部分”之后的结果等于6了,因为6.999999999999999的整数部分确实等于6(虽然四舍五入等于7,但“取整数部分”的操作是比较憨傻的)。可是可是,为什么0.7 / 0.1不正好等于7呢?这就是计算机世界和现实世界的差别之一。完美的数学世界里,任意两个实数之间必然存在无穷个实数,而计算机不这么认为。因为计算机的位数有限,它能表达的实数是有限的,实数之间总是存在一个个“空隙”,在计算机的世界里,“两个相邻的实数”是合理的说法。不精确但是意思到了的类比是,在只能显示五个数字的计算器液晶屏上,刚刚比1.0000大的下一个数就是1.0001,而介于其间的其他数,如1.00005、1.0000342376,则无法被这个液晶屏精确表达。

说出来你可能不信,0.1就是一个计算机无法精确表达的数字。这个数字对于我们这些习惯了十进制的人来说,是如此的简洁。可是机器用二进制思考,在二进制的世界里,十进制的0.1是一个无限循环小数:0.000101000101…,无法被精确表示。

再考虑这段例子:

>>> 1e10
10000000000.0
>>> 1e10000
inf
>>> 

1e10的意思是1乘以10的10次方,计算机心领神会地把这个数字表达出来了。1e10000的意思是1乘以10的10000次方,计算机口吐白沫地说:这个数……太大了……这就是传说中的“无穷大”吧?

再看看下面这段调试语句,现在不需要立刻明白它,也不需要记得它,我来讲解一下:第一句’A’ == ‘a’问,大写A和小写a相等吗?回答说,不不不。第二句问,那就是大写A比小写a大喽?回答说,不不不。第三句问,难道大写A比小写a小?回答说,答对了。

>>> 'A' == 'a'
False
>>> 'A' > 'a'
False
>>> 'A' < 'a'
True
>>> 

平时我们看书看路牌时,并不十分在乎字母的大小写,把它们当作同一样东西,即使有所不同,大写字母也比小写字母的份量重,但在计算机眼里,它们是不同的,而且小写a大于大写A(这里的“大于”有不同于“体积”、“重量”、“价值”的含义)。字母的大小写问题,在很多做数据提取工作的程序员手里是个噩梦。

一个“灰色”的矩形

一个“灰色”的矩形

右边这个灰色的长方块,乍一看没有什么特别之处,站在两米外看,它更是灰得平庸。点击它,把它放大了细细地看,你就会发现这个图片里没有一个像点是灰色或黑色的,它是由红、绿、蓝、白四种颜色混合在一起。实际上,你面前的整块屏幕都是这样表达颜色的。屏幕上的每个像素,都由红、绿、蓝三个发光点组成,通过调整三个发光点各自的亮度,你最终看到的就是各式各样的颜色。

当然啦,我们讨论的话题不是视错觉,而是编程。上面的这三个例子是说,计算机并不像物理世界那样精准、无限、连续,它是近似的、有限的、离散的(实数的表达和颜色的显示)。当人们想让它智能些、通融些的时候,它又显得愚蠢、刻板、不近人情(字母的大小写)。程序员在夹缝中求生存,让计算机尽可能地模拟物理世界的一些事件(例如用三种颜色来模拟真彩色),并尽力绕过可能产生或放大误差的地方。同时,又想让它多考虑考虑人的感受,不要把“U.S.A.”、“USA”、“usa”、“United States”、“美国”当成几样毫不相干的东西。

关于“计算机”——你大约留意到了,我不用“电脑”这个词。我认为“电脑”给人造成一种误解,觉得它是能思想的。其实,到目前为止,还没有任何一台计算机拥有像人一样思索的能力。不管是下国际象棋赢了人类的世界冠军的,还是答题比赛赢了上届状元的,都只是在执行人们预先告诉过它们的指令。聪明智慧的程序员通过编程,把这些机器打扮成仿佛拥有思索能力一般。事实上,在这些机器奔腾的、发热的、靠风扇降温的心里,基本上只有两样事情:“移动”和“加法”。它们只是计算机。

  • 通告关闭
  • 评论 (1)
    • Kitty
    • 2012年12月12日 9:58下午

    文章写的很亲切生动,娓娓道来,认识你的人读这篇文章一定会觉得身临其境,形象生动。赞~\(≧▽≦)/~~~其实我一直以来的感觉都觉得你是教育方面的人才,知识的储备和贯通上无人能及,上知天文,下知地理。并且态度上还循循善诱,耐心细致。再赞~~不知道想不想施展自己这方面的才华啊,报效祖国的时候到了。(*^__^*) 嘻嘻……

评论关闭