3.3 不同类型的数字
我们在前一章所创建的所有变量都是数字,但R包含三种不同类别的数值变量:浮点值numeric
、整数integer
和复数complex
。可通过检查变量的类型class
把它们分辨出来:
class(sqrt(1:10))
## [1] "numeric"
class(3 + 1i) #"i"创建了复数的虚部
## [1] "complex"
class(1) #尽管只有一个数字,这也是一个numeric类
## [1] "numeric"
class(1L) #添加L后缀把数字变为整型
## [1] "integer"
class(0.5:4.5) #冒号操作符返回的值是numeric类……
## [1] "numeric"
class(1:5) #除非所有值都是整数
## [1] "integer"
请注意,当写作本书时,即使把R程序安装在64位操作系统上,所有的浮点数仍是32位的(“双精度”),而16位(“单精度”)的数字是不存在的。
输入.Machine
将显示一些R的数字属性信息。虽然从理论上说,这些值在不同的机器上可能不一样,但在大多数的构建(build)中,大部分的值是相同的。通常情况下,你无需留意.Machine
返回的值。但值得注意的是,R中最大的全精度浮点数是1.8e308
。此数值对于满足日常工作已足够大,但比无穷大要小得多!可以表示的最小正数是2.2e-308
。最大的整数为2^31 - 1
,它不过比二十亿多一点儿罢了(反之最小的负整数为-2 ^ 31 + 1
)1。
1 如果这些极限值还不够你用,你可以从Rmpfr
包中得到更高精度的值,或从brobdingnab
包得到非常大的数字。不过,这些都是非常少见的需求,而R中的三个内置数字类几乎能适用于所有用途。
其他唯一值得注意的数值是ε,它是最小的正浮点数,例如|ε + 1| != 1
。你可以用这种奇特的方法来表示两个数是如此之接近,因而R知道它们是不同的。它的值大概为2.2e-16
。在你使用all.equal
来比较两个数字向量是否相等时,这个值就会被派上用场。
事实上,所有这些都比你想象的更简单,因为完全不可能(故意地)不使用整数。R的设计使得几乎在所有地方都需要使用整数,例如对一个向量进行索引。浮点数也是如此。