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