Reliable Comparison of Floating Point Numbers

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.


Build Status Coverage Status CRAN_Status_Badge Downloads DOI

Reliable comparison of floating point numbers

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.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 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
tol = .Machine$double.eps^0.5       # default value
options(fpCompare.tolerance = tol)
 
# perform 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 (%>%).

Installation

From CRAN

install.packages("fpCompare")

From GitHub

library(devtools)
install_github("PredictiveEcology/fpCompare")

Bug Reports

https://github.com/PredictiveEcology/fpCompare/issues

News

Known issues: https://github.com/PredictiveEcology/fpCompare/issues

version 0.2.2

  • update maintainer's email address

version 0.2.1

  • update maintainer's email address
  • use HTTPS for CRAN urls
  • improved vignette formatting (use rmarkdown::render)

version 0.2.0

  • 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:

    • use short urls to avoid links spilling into margins

version 0.1.0

  • initial version

  • adds new numeric relational operators that do comparisons using a tolerance value:

    • %>=%, %<=%, %==%, %!=%
  • use options(fpCompare.tolerance = value) to set tolerance

Reference manual

It appears you don't have a PDF plugin for this browser. You can click here to download the reference manual.

install.packages("fpCompare")

0.2.3 by Alex M Chubaty, 3 months ago


https://github.com/PredictiveEcology/fpCompare


Report a bug at https://github.com/PredictiveEcology/fpCompare/issues


Browse source code at https://github.com/cran/fpCompare


Authors: Alex M Chubaty [aut, cre] , Her Majesty the Queen in Right of Canada , as represented by the Minister of Natural Resources Canada [cph]


Documentation:   PDF Manual  


GPL-3 license


Suggests knitr, rmarkdown, testthat


Imported by SpaDES.core, SpaDES.tools, iemisc, quickPlot, reproducible.


See at CRAN