Comparisons of floating point numbers are problematic due to errors associated with the binary representation of decimal numbers. Computer scientists and programmers are aware of these problems (.e.g., Goldberg 1991) and yet people still use numerical methods which fail to account for floating point errors (this pitfall is the first to be highlighted in the First Circle of “The R Inferno” (Burns 2012)).
To avoid these and other numerical rounding issues, R’s help file for
relational operators (e.g., ?'>'
) suggests
using identical
and all.equal
when making
numerical comparisons:
<- 0.5 - 0.3
x1 <- 0.3 - 0.1
x2 == x2 # FALSE on most machines
x1 identical(all.equal(x1, x2), TRUE) # TRUE everywhere
Inspired by R FAQ 7.31 and this Stack Overflow answer, this package provides new relational operators useful for performing floating point number comparisons with a set tolerance:
fpCompare 1 |
base |
---|---|
%>=% |
>= |
%>>% |
> |
%<=% |
<= |
%<<% |
< |
%==% |
== |
%!=% |
!= |
These functions use the base
relational operators to
make comparisons, but incorporate a tolerance value
(fpCompare.tolerance
) similar to all.equal
.
The default fpCompare.tolerance
value is
.Machine$double.eps^0.5
, set via options
. This
is the same default used in all.equal
for numeric
comparisons.
# set telorance value
= .Machine$double.eps^0.5 # default value
tol options(fpCompare.tolerance = tol)
# perform comparisons
<- 0.5 - 0.3
x1 <- 0.3 - 0.1
x2 == x2 # FALSE on most machines
x1 %==% x2 # TRUE everywhere x1
install.packages("fpCompare")
library(devtools)
install_github("PredictiveEcology/fpCompare")
The %<<%
and %>>%
symbols are used instead of %<%
and %>%
to avoid a conflict with magrittr
’s pipe operator
(%>%
).↩︎