UNPKG

double-double

Version:

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

54 lines 2.07 kB
// Modified from https://github.com/bartaz/ieee754-visualization/ // under the MIT license // Copyright 2013 Bartek Szopka (original author) import { doubleToBinaryString } from "./double-to-binary-string.js"; import { doubleToOctets } from "./double-to-octets.js"; /** * Returns the relevant parts of the given IEEE-754 double. The returned * exponent has been normalized (i.e. 1023 ha been subtracted) and the * significand has the hidden bit added if appropriate. * See https://github.com/bartaz/ieee754-visualization */ function parseDouble(x) { const parts = doubleToOctets(x); const p0 = parts[0]; const p1 = parts[1]; const sign = p0 >> 7; const exponent_ = ((p0 & 0b0111_1111) << 4) + ((p1 & 0b11110000) >> 4); //---- Check for negative / positive zero / denormalized numbers. const hiddenMsb = exponent_ === 0 ? 0 : 16; // Note: exponent === 0 => 0 or denormalized number (a.k.a. subnormal number). const exponent = exponent_ === 0 ? exponent_ - 1022 // Subnormals use a biased exponent of 1 (not 0!) : exponent_ - 1023; //---- Break up the significand into bytes const significand = parts.slice(1); significand[0] = (p1 & 0b0000_1111) + hiddenMsb; return { sign, exponent, significand }; } /** * Returns the relevant parts of the given IEEE-754 double. * See https://github.com/bartaz/ieee754-visualization. * This is a slower version of parseDouble that gives binary string * representations of the components. */ function parseDoubleDetailed(x) { const str = doubleToBinaryString(x); // sign{1} exponent{11} fraction{52} === 64 bits (+1 hidden!) const [, sign, exponent, significand] = str.match(/^(.)(.{11})(.{52})$/); const exponent_ = parseInt(exponent, 2); const hidden = exponent_ === 0 ? "0" : "1"; return { full: sign + exponent + hidden + significand, sign, exponent, hidden, significand }; } export { parseDouble, parseDoubleDetailed }; //# sourceMappingURL=parse-double.js.map