altimit
altimit

Reputation: 421

rounding of digits

I'm having troubles with

set.seed(1)
sum(abs(rnorm(100)))
set.seed(1)
cumsum(abs(rnorm(100)))

Why does the value of the sum differ from the last value of the cumulative sum with the cumulative sum preserving the all decimal digits and sum rounding 1 digit off.

Upvotes: 2

Views: 464

Answers (2)

Rich Scriven
Rich Scriven

Reputation: 99331

This is a consequence of the way R prints atomic vectors.

With the default digits option set to 7 as you likely have, any value between -1 and 1 will print with seven decimal places. Because of the way R prints atomic vectors, all other values in the vector will also have seven decimal places. Furthermore, a value of .6264538 with digits option set to 7 must print with eight digits (0.6264538) because it must have a leading zero. There are two of these values in your rnorm() vector.

If you look at cumsum(abs(rnorm(100)))[100] alone and you can see the difference (actually it becomes the same as printed value as sum(abs(rnorm(100))), although not exactly the same value).

sum(abs(rnorm(100)))
# [1] 71.67207
cumsum(abs(rnorm(100)))[100]
# [1] 71.67207

Notice that both of these values have seven digits. Probably the most basic example of this I can think of is as follows

0.123456789
#[1] 0.1234568
1.123456789
#[1] 1.123457
11.123456789
# [1] 11.12346
## and so on ...

Upvotes: 3

petermeissner
petermeissner

Reputation: 12860

Also note that this really really is about how values are printed i.e. presented. This does not change the values themselves, e.g. ...

set.seed(1)
d1 <- sum(abs(rnorm(100)))

set.seed(1)
d2 <- cumsum(abs(rnorm(100)))

(d1 == d2)[100]
## [1] TRUE

Upvotes: 4

Related Questions