trunc()
和as.integer()
之间的区别是什么?
为什么as.integer
更快?任何人都可以解释幕后发生的事情吗?
为什么trunc()
会返回课程double
而不是integer
?
x <- c(-3.2, -1.8, 2.3, 1.5, 1.500000001, -1.499999999)
trunc(x)
[1] -3 -1 2 1 1 -1
as.integer(x)
[1] -3 -1 2 1 1 -1
all.equal(trunc(x), as.integer(x))
[1] TRUE
sapply(list(trunc(x), as.integer(x)), typeof)
[1] "double" "integer"
library(microbenchmark)
x <- sample(seq(-5, 5, by = 0.001), size = 1e4, replace = TRUE)
microbenchmark(floor(x), trunc(x), as.integer(x), times = 1e4)
# I included floor() as well just to see the performance difference
Unit: microseconds
expr min lq mean median uq max neval
floor(x) 96.185 97.651 126.02124 98.237 99.411 67892.004 10000
trunc(x) 56.596 57.476 71.33856 57.770 58.649 2704.607 10000
as.integer(x) 16.422 16.715 23.26488 17.009 18.475 2828.064 10000
help(trunc)
:
“trunc采用单个数字参数x并返回一个数字向量,其中包含通过将x中的值截断为0而形成的整数。”
help(as.integer)
:
“非整数数值被截断为零(即as.integer(x)等于trunc(x)),[...]”
背景:我正在编写函数来在不同的时间/日期表示之间进行转换,例如120403 (hhmmss) -> 43443
(自00:00:00以来的秒数)性能非常重要。
注意:这个问题与浮点运算
无关SessionInfo: R version 3.3.2, Windows 7 x64
答案 0 :(得分:4)
在技术方面,这些功能有不同的目标。
trunc
函数删除数字的小数部分。
as.integer
函数将输入值转换为32位整数。
因此as.integer
会溢出大数字(超过2 ^ 31):
x = 9876543210.5
sprintf("%15f", x)
# [1] "9876543210.500000"
sprintf("%15f", trunc(x))
# [1] "9876543210.000000"
as.integer(x)
# [1] NA
答案 1 :(得分:0)
vector
中的值已经为numeric
。
as.integer
用于将数据转换为numeric
:
as.integer("3.55")
# [1] 3
trunc("3.55")
# Error in trunc("3.55") : non-numeric argument to mathematical function