## ----include = FALSE----------------------------------------------------------
knitr::opts_chunk$set(collapse = TRUE, comment = "#>")

## ----setup--------------------------------------------------------------------
library(zuexact)

## -----------------------------------------------------------------------------
x <- c(1e16, 1, -1e16)
sum(x) # 1 with 80-bit long doubles, 0 without
capabilities("long.double")

## -----------------------------------------------------------------------------
sum(c(1e20, 1, -1e20))

## -----------------------------------------------------------------------------
y <- c(1, 1e100, 1, -1e100)
c(sum(y), sum(rev(y)))

## -----------------------------------------------------------------------------
xsum(x)
xsum(c(1e20, 1, -1e20))
c(xsum(y), xsum(rev(y)))

## -----------------------------------------------------------------------------
z <- c(1e15, -1e15, 0.1)
mean(z)
xsum_mean(z)

## -----------------------------------------------------------------------------
a <- c(1e8 + 1, 1)
b <- c(1e8 - 1, -1e16)
sum(a * b)
xsum_dot(a, b)

## -----------------------------------------------------------------------------
xsum(c(1, NaN, NA))
xsum(c(Inf, -Inf))
xsum(c(1e308, 1e308))
xsum(c(1e308, 1e308, -1e308)) # the intermediate overflow does not matter

## -----------------------------------------------------------------------------
acc <- xsum_acc()
acc <- xsum_add(acc, c(1e20, 1))
acc <- xsum_add(acc, -1e20)
xsum_value(acc)

## -----------------------------------------------------------------------------
set.seed(1)
v <- (2 * runif(1e5) - 1) * 10^sample(-15:15, 1e5, TRUE)
chunks <- split(v, rep(1:8, length.out = length(v)))
accs <- lapply(chunks, xsum_acc) # or parallel::mclapply(), mirai, future
identical(xsum_value(Reduce(xsum_merge, rev(accs))), xsum(v))

## -----------------------------------------------------------------------------
xsum_value(xsum_merge(xsum_acc(c(0.1, 0.2)), xsum_negate(xsum_acc(0.3))))

