R是否将数字在内部视为两倍?

时间:2019-04-15 05:27:01

标签: r integer double

R是否主要将数字视为双数?

以下代码建议R将数字视为双精度数字。即使将其设为整数,经过一些计算它也很容易变成两倍。 (代码1)

此外,即使结果看起来像整数,也将其视为两倍。 (代码2)

我的理解正确吗?

代码1:

> typeof(5)
[1] "double"

> typeof( 5 / 1 )
[1] "double"

> typeof( as.integer(c(1,2,3)) )
[1] "integer"

> typeof( as.integer(c(1,2,3)) + 1 )
[1] "double"

> typeof( as.integer(c(1,2,3)) / 1 )
[1] "double"

代码2:

> 1 + 2 
[1] 3

> typeof( 1 + 2)
[1] "double"

2 个答案:

答案 0 :(得分:1)

R以不同的方式处理数字。在R中,整数和双精度浮点数均默认为其32位版本。

安德烈(Andrey)指出,R中有两种不同类型的数字。

  1. 文学1L, 2L, 3L, ....,相当于as.integer(1)
  2. 常规数字(1、2、3.4,实际上是任意数字)

以及复杂的副本。

文学本身就是整数

typeof(1)  #double
class(1)   #numeric
typeof(1L) #integer
class(1L)  #integer

定义明确。但是,在计算时,如果计算的任何部分没有以小于或等于整数的类型存储,它将自动转换为双精度型:

typeof(1L + 1L)   #integer
typeof(1L + 1)    #double
typeof(1L + TRUE) #integer
typeof(1L * 3)    #double
typeof(1L * 3L)   #integer

但是请注意,由于R使用32位变量运行,因此与python 3.x相比,这些变量的范围有限。但是,可以使用bit64包(用于64位整数)和Rmpfr包来解决32位变量(在大多数情况下!),该包为任意浮点精度提供接口(根据其文档)。

答案 1 :(得分:0)

要使数字从一开始就为整数,请向其添加L

typeof(1L)
# [1] "integer"

尽管使用32位整数存在危险:

2e9L
# [1] 2000000000
2e9L + 2e9L
# [1] NA
# Warning message:
# In 2000000000L + 2000000000L : NAs produced by integer overflow