Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

What is the difference between trunc() and as.integer()?

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
like image 825
rluech Avatar asked Oct 20 '25 12:10

rluech


1 Answers

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
like image 191
Andrey Shabalin Avatar answered Oct 23 '25 05:10

Andrey Shabalin



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!