3.3 不同类型的数字

我们在前一章所创建的所有变量都是数字,但R包含三种不同类别的数值变量:浮点值numeric、整数integer和复数complex。可通过检查变量的类型class把它们分辨出来:

  1. class(sqrt(1:10))
  2. ## [1] "numeric"
  3. class(3 + 1i) #"i"创建了复数的虚部
  4. ## [1] "complex"
  5. class(1) #尽管只有一个数字,这也是一个numeric类
  6. ## [1] "numeric"
  7. class(1L) #添加L后缀把数字变为整型
  8. ## [1] "integer"
  9. class(0.5:4.5) #冒号操作符返回的值是numeric类……
  10. ## [1] "numeric"
  11. class(1:5) #除非所有值都是整数
  12. ## [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的设计使得几乎在所有地方都需要使用整数,例如对一个向量进行索引。浮点数也是如此。