What is the difference between trunc() and as.integer()?
integer, performance, r, truncate
Solution
On the technical side, these functions have different goals.
The `trunc` function removes the fractional part of numbers.
The `as.integer` function converts the input values into 32-bit integers.
Thus `as.integer` would overflow on large numbers (over 2^31):
x = 9876543210.5
sprintf("%15f", x)
# [1] "9876543210.500000"
sprintf("%15f", trunc(x))
# [1] "9876543210.000000"
as.integer(x)
# [1] NA
Problem
What is the difference between `trunc()` and `as.integer()`? Why is `as.integer` faster? Can anyone explain a bit what goes on behind the curtain? Why does `trunc()` return class `double` instead of `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 takes a single numeric argument x and returns a numeric vector containing the integers formed by truncating the values in x toward 0." `help(as.integer)`: "Non-integral numeric values are truncated towards zero (i.e., as.integer(x) equals trunc(x) there), [...]" Background: I'm writing functions to translate between different time/date representation, such as `120403 (hhmmss) -> 43443` (seconds since 00:00:00) Performance is all that matters. Note: this question has nothing to do with floating point arithmetic ``` SessionInfo: R version 3.3.2, Windows 7 x64 ```