1

I execute a code to use in a probability simulator, that generate an error. For instante, the code can be the next:

m<-replicate(101,NaN)
for(i in seq(0,1, by=0.01)){

  m[(i*100)+1]<-i+1
}

print(m)

it generates a error in m[30] and in m[59] because the value is NaN. The output vector is the next:

 [1] 1.00 1.01 1.02 1.03 1.04 1.05 1.06 1.07 1.08 1.09 1.10 1.11 1.12 1.13 1.14
 [16] 1.15 1.16 1.17 1.18 1.19 1.20 1.21 1.22 1.23 1.24 1.25 1.26 1.27 1.29  NaN
 [31] 1.30 1.31 1.32 1.33 1.34 1.35 1.36 1.37 1.38 1.39 1.40 1.41 1.42 1.43 1.44
 [46] 1.45 1.46 1.47 1.48 1.49 1.50 1.51 1.52 1.53 1.54 1.55 1.56 1.58  NaN 1.59
 [61] 1.60 1.61 1.62 1.63 1.64 1.65 1.66 1.67 1.68 1.69 1.70 1.71 1.72 1.73 1.74
 [76] 1.75 1.76 1.77 1.78 1.79 1.80 1.81 1.82 1.83 1.84 1.85 1.86 1.87 1.88 1.89
 [91] 1.90 1.91 1.92 1.93 1.94 1.95 1.96 1.97 1.98 1.99 2.00

Thanks for your help

Angel Prieto
  • 43
  • 1
  • 7

2 Answers2

5

The problem is a variant of the effects discussed in this post: Why are these numbers not equal?

Numerical roundoff errors lead to non-integer index numbers in m[(i*100)+1] Try using integer numbers instead:

for(i in seq(0,100)){    
  m[i+1] <- i/100 + 1
}
RHertel
  • 23,412
  • 5
  • 38
  • 64
3

You can solve this by rounding your index values:

for(i in seq(0,1, by=0.01)){
  m[round((i*100)+1)]<-i+1
}
Istrel
  • 2,508
  • 16
  • 22
  • 2
    Not that weird, after all. It's floating point arithmetics. The precision is finite – RHertel Mar 08 '19 at 20:35
  • I call it weird, because `as.integer` doesn't solve this. – Istrel Mar 08 '19 at 20:36
  • @RHertel, sorry, I missed that `as.integer` just strips out anything after the decimal point, so 2.9999999... will be 2. Yes, it is not weird, after all. – Istrel Mar 08 '19 at 20:59