UNPKG

quaeratin

Version:

An extended precision floating point library (as per Shewchuk) - precision only limited by overflow / underflow

46 lines 1.62 kB
import { eCompress } from "./e-compress.js"; // We *have* to do the below❗ The assignee is a getter❗ The assigned is a pure function❗ const compress = eCompress; /** * Returns the result of adding a double to an expansion. * * Let e be a nonoverlapping expansion of m p-bit components, and let b be a * p-bit value where p >= 3. Suppose that the components e_1, ..., e_m are * sorted in order of *increasing* magnitude, except that any of the ei may be * zero. * Then the following algorithm will produce a nonoverlapping expansion such * that h = sum_i(h_i) = e + b, where the components h_1, ..., h_(m+1) are also * in order of increasing magnitude, except that any of the h_i may be zero. * Furthermore, if e is nonadjacent and round-to-even tiebreaking is used, then * h is nonadjacent. * See https://people.eecs.berkeley.edu/~jrs/papers/robustr.pdf * @param e A floating point expansion * @param b Another floating point expansion */ function growExpansion(e, b) { const m = e.length; let q = b; //const h: number[] = new Array(m+1); const h = []; //let j = 0; for (let i = 0; i < m; i++) { // Note the use of twoSum and not fastTwoSum. //[h[i], q] = ts(q, e[i]); const ee = e[i]; const x = q + ee; const bv = x - q; const hh = (q - (x - bv)) + (ee - bv); if (hh !== 0) { h.push(hh); } q = x; } //h[j] = q; if (q !== 0 || h.length === 0) { h.push(q); } //return compress(h); return h; } export { growExpansion }; //# sourceMappingURL=grow-expansion.js.map