Comparisons of floating point numbers are problematic due to errors associated with the binary representation of decimal numbers. Despite being aware of these problems, people still use numerical methods that fail to account for these and other rounding errors (this pitfall is the first to be highlighted in Circle 1 of Burns (2012) 'The R Inferno' < http://www.burns-stat.com/pages/Tutor/R_inferno.pdf>). This package provides new relational operators useful for performing floating point number comparisons with a set tolerance.
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 and yet people still use numerical methods which fail to account for floating point errors (this pitfall is the first to be highlighted in Circle 1 of Burns (2012) The R Inferno).
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.3x2 <- 0.3 - 0.1x1 == x2 # FALSE on most machinesidentical(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 valuetol = .Machine$double.eps^0.5 # default valueoptions(fpCompare.tolerance = tol) # perform comparisonsx1 <- 0.5 - 0.3x2 <- 0.3 - 0.1x1 == x2 # FALSE on most machinesx1 %==% x2 # TRUE everywhere
[^1]: The %<<%
and %>>%
symbols are used instead of %<%
and %>%
to avoid a conflict with magrittr
's pipe operator (%>%
).
install.packages("fpCompare")
library(devtools)install_github("PredictiveEcology/fpCompare")
Known issues: https://github.com/PredictiveEcology/fpCompare/issues
rmarkdown::render
)add %<<%
and %>>%
operators ('less than'; 'greater than')
move cph
to end of the author field so aut
displays as first name on CRAN
fix bug report url in documentation
improved documentation and formatting:
initial version
adds new numeric relational operators that do comparisons using a tolerance value:
%>=%
, %<=%
, %==%
, %!=%
use options(fpCompare.tolerance = value)
to set tolerance