UNPKG

double-double

Version:

Pure double-double precision functions *with strict error bounds*.

33 lines (24 loc) 920 B
/** @internal */ const f = 2**27 + 1; /** * Returns the exact result of squaring a double. * * * the resulting expansion is least significant double first. * * Theorem 18 (Shewchuk): Let a and b be p-bit floating-point numbers, where * p >= 6. Then the following algorithm will produce a nonoverlapping expansion * x + y such that ab = x + y, where x is an approximation to ab and y * represents the roundoff error in the calculation of x. Furthermore, if * round-to-even tiebreaking is used, x and y are non-adjacent. * * See https://people.eecs.berkeley.edu/~jrs/papers/robustr.pdf * @param a A double */ function twoSquare(a: number): number[] { const x = a*a; //const [ah, al] = split(a); const c = f * a; const ah = c - (c - a); const al = a - ah; const y = (al*al) - ((x - (ah*ah)) - 2*(ah*al)); return [y,x]; } export { twoSquare }