R: Basic Sum Operations without Round-off Errors

sumexact, cumsumexact {caTools} | R Documentation

## Basic Sum Operations without Round-off Errors

### Description

Functions for performing basic sum operations without round-off errors

### Usage

      sumexact(..., na.rm = FALSE)
      cumsumexact(x)

### Arguments

`x` | numeric vector
`...` | numeric vector(s), numbers or other objects to be summed
`na.rm` | logical. Should missing values be removed?

### Details

All three functions use full precision summation using multiple doubles for intermediate values. The sum of numbers x & y is a=x+y with error term b=error(a+b). That way a+b is equal exactly x+y, so sum of 2 numbers is stored as 2 or fewer values, which when added would under-flow. By extension sum of n numbers is calculated with intermediate results stored as array of numbers that can not be added without introducing an error. Only final result is converted to a single number

### Value

Function `sumexact` returns single number. Function `cumsumexact` returns vector of the same length as `x`.

### Author(s)

Jarek Tuszynski (SAIC) jaroslaw.w.tuszynski@saic.com based on code by Vadim Ogranovich, which is based on algorithms described in references, pointed out by Gabor Grothendieck.

### References

Round-off error correction is based on: Shewchuk, Jonathan, Adaptive Precision Floating-Point Arithmetic and Fast Robust Geometric Predicates

McCullough, D.B., (1998) Assessing the Reliability of Statistical Software, Part I, The American Statistician, Vol. 52 No.

McCullough, D.B., (1999) Assessing the Reliability of Statistical Software, Part II, The American Statistician, Vol. 53 No 2

NIST Statistical Reference Datasets (StRD) website

### See Also

- `sum` is faster but not error-save version of `sumexact`

- `cumsum` is equivalent to `cumsumexact`

### Examples

      x = c(1, 1e20, 1e40, -1e40, -1e20, -1)
      a = sum(x);         print(a)
      b = sumexact(x);    print(b)
      stopifnot(b==0)
      a = cumsum(x);      print(a)
      b = cumsumexact(x); print(b)
      stopifnot(b[6]==0)

[Package caTools version 1.18.0 Index]