[ < ] | [ > ] | [ << ] | [ Up ] | [ >> ] | [Top] | [Contents] | [Index] | [ ? ] |
The only numbers that can be represented exactly in R's numeric type are integers and fractions whose denominator is a power of 2. Other numbers have to be rounded to (typically) 53 binary digits accuracy. As a result, two floating point numbers will not reliably be equal unless they have been computed by the same algorithm, and not always even then. For example
R> a <- sqrt(2) R> a * a == 2 [1] FALSE R> a * a - 2 [1] 4.440892e-16 |
The function all.equal()
compares two objects using a numeric
tolerance of .Machine$double.eps ^ 0.5
. If you want much greater
accuracy than this you will need to consider error propagation
carefully.
For more information, see e.g. David Goldberg (1991), "What Every Computer Scientist Should Know About Floating-Point Arithmetic", ACM Computing Surveys, 23/1, 5-48, also available via http://www.validlab.com/goldberg/paper.pdf.
To quote from "The Elements of Programming Style" by Kernighan and Plauger:
10.0 times 0.1 is hardly ever 1.0.
This document was generated by root on April, 26 2012 using texi2html 1.76.