# [R] floor()

(Ted Harding) Ted.Harding at nessie.mcc.ac.uk
Wed Nov 30 01:09:47 CET 2005

```On 29-Nov-05 Werner Bier wrote:
> Dear All,
>
>   Is this right?
>
>   >  floor((5.05-floor(5))*100)
> [1] 4
>
>   I would expect 5, or am I wrong?
>
>   Thanks and regards,
>   W

It may seem reasonable to expect it, but in the case of R
(and most other computer languages) you would be wrong.

The reason:

print((5.05-floor(5))*100,digits=20)
[1] 4.9999999999999822

whose floor() is 4.

The underlying reason for this and all similar phenomena is
the slight imprecision of floating-point arithmetic when the
fractional part is not a multiple of 1/2^k for some k. Since
0.05 = 1/20 and 20 = 4*5, you have a factor 1/5 in there and
the imprecision will occur.

If you really *know* what you are doing in a particular context,
you can guard against it by a deliberate tiny mistake, such as

dtm <- 1e-13
floor((5.05-floor(5))*100 + dtm)
[1] 5

but you have to be careful that you don't let this happen when
it should not happen. And you have to choose your dtm with
care: 1e-14 is not good enough!

Though, since the trouble really arises at the (5.05-floor(5))
level, you could use, more judiciously,

dtm <- 1e-15
floor((5.05-floor(5)+dtm)*100)
[1] 5

and here 1e-16 won't work.

Check:

print((5.05-floor(5)),digits=20)
[1] 0.049999999999999822

where the last "9" is the 15th digit after the ".".

Best wishes,
Ted.

--------------------------------------------------------------------
E-Mail: (Ted Harding) <Ted.Harding at nessie.mcc.ac.uk>
Fax-to-email: +44 (0)870 094 0861
Date: 30-Nov-05                                       Time: 00:09:44
------------------------------ XFMail ------------------------------

```