First release.
Vendors Radford Neal’s ‘xsum’ (stable version 3), patched so that no standard I/O reaches the compiled code; upstream’s checker and fuzzer run against the vendored copy in CI.
A vignette, vignette("exact-summation"), explains
why base sum() differs between platforms and how to sum in
pieces and from C.
xsum() returns the exactly rounded sum of double,
integer, logical and complex vectors, with na.rm, applying
the same special-value rules on every platform. ALTREP vectors are read
in blocks, never materialised.
zuexact_info() reports the vendored ‘xsum’ version,
the accumulator threshold, SIMD and FMA support, and whether R has long
doubles.
xsum_mean() divides the exact sum by the count with
one rounding; xsum_weighted_mean() divides two exact
sums.
xsum_dot(), xsum_sqnorm() and
xsum_norm() include each product’s rounding error
(TwoProduct with fma()), so dot products are exactly
rounded too.
xsum_cumsum() rounds every prefix sum
exactly.
Accumulators as R values: xsum_acc(),
xsum_add(), xsum_merge(),
xsum_negate(), xsum_value() and
xsum_mean_value() build exact sums in pieces, in any order,
and across processes (they serialise).
xsum_rowsums(), xsum_colsums() and
xsum_by() are exact versions of rowSums(),
colSums() and rowsum(). Row sums work a block
of rows at a time, so their extra memory does not grow with the number
of rows.
A registered C interface, zuexact_api_v1 in
inst/include/zuexact.h, gives other packages’ C code the
same exact accumulators, sums, dot products, merges and means, through
LinkingTo: zuexact.
Every result is tested against exact rational arithmetic (‘gmp’),
PreciseSums::fsum(), the test262
Math.sumPrecise vectors and ill-conditioned inputs up to
condition number 1e40, and must be bit-identical on every CI
platform.