第3章 数据结构
了解一门语言,当然要从它的数据结构开始,否则你无法操纵程序中的对象。这对单身忍者尤其重要:有时候胡子拉碴忙活了大半夜,突然程序告诉你连对象都找不到,你悲催的心情,一定凉过杜甫的茅屋为秋风所破歌。
3.1 向量
忍者判断数值相对大小从来不用大于小于或等号,也从来不目测,因为在浮点数运算中,大小比较从来不靠谱。以下这事儿让COS的R版主都震惊了(http://cos.name/cn/topic/106794):
seq(0,1,by=0.2)
x=seq(0,1,by=0.2)
y=4] y[
## [1] 0.6
3] x[
## [1] 0.4
1-x[3]
## [1] 0.6
4]>1-x[3] y[
## [1] TRUE
竟然出现了0.6大于0.6的情况,版主大人大呼坑爹。当时我的回帖是:
作为R版版主,应该做到在凌晨四点突然被人叫醒问你10乘以0.1等于几,你在1秒钟之内斩钉截铁回答,不是1!(R FAQ 7.31)。
简单来说就是浮点数在计算机中的表达有限制,不能以任意精度存储,所以尤其是微小的数字或巨大的数字在运算时经常会有些意外情况。再举几个例子:
seq(0,1,.1)
## [1] 0.0 0.1 0.2 0.3 0.4 0.5 0.6 0.7 0.8 0.9 1.0
seq(0,1,.1)==c(0,.1,.2,.3,.4,.5,.6,.7,.8,.9,1)
## [1] TRUE TRUE TRUE FALSE TRUE TRUE FALSE FALSE TRUE TRUE TRUE
.3-.7+.4==0
## [1] FALSE
sqrt(2)^2==2
## [1] FALSE