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:1991ac] 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:2012ri]).
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:
x1 <- 0.5 - 0.3
x2 <- 0.3 - 0.1
x1 == x2 # FALSE on most machines
identical(all.equal(x1, x2), TRUE) # TRUE everywhere
Inspired by R FAQ 7.31 and this Stack Overflow answer, this package provides four new relational operators useful for performing floating point number comparisons[1] with a set tolerance:
%>=%
%<=%
%==%
%!=%
These functions use the base
relational operators to make comparisons, but like all.equal
, incorporate a tolerance value (fpCompare.tolerance
). The default fpCompare.tolerance
value is .Machine$double.eps^0.5
, set via options
. This is the same default vaule used in all.equal
for numeric comparisons.
x1 <- 0.5 - 0.3
x2 <- 0.3 - 0.1
x1 == x2 # FALSE on most machines
x1 %==% x2 # TRUE everywhere
[1]: The %<=%
and %>=%
symbols are used instead of %<%
and %>%
to avoid a conflict with magrittr
's pipe operator (%>%
).
From GitHub:
library(devtools)
install_github("achubaty/fpCompare")
https://github.com/PredictiveEcology/fpCompare/issues