@lvlte/ulp
Version:
Compute the unit in last place of a given IEEE-754 64-bit number
31 lines (30 loc) • 824 B
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.FLOAT64_MIN = void 0;
exports.eps = eps;
exports.exponent = exponent;
const modf_1 = require("@lvlte/modf");
exports.FLOAT64_MIN = Math.pow(2, -1022);
function eps(x = 1) {
if (Number.isFinite(x)) {
x = Math.abs(x);
if (x <= exports.FLOAT64_MIN) {
return Number.MIN_VALUE;
}
return Math.pow(2, (_exponent(x) - 52));
}
return NaN;
}
function exponent(x) {
if (Number.isFinite(x) && x !== 0) {
return _exponent(Math.abs(x));
}
return NaN;
}
function _exponent(x) {
const [ipart, fpart] = (0, modf_1.modf)(x);
if (ipart > 0) {
return ipart.toString(2).split('.', 1)[0].length - 1;
}
return -(fpart.toString(2).split('1', 1)[0].length - 1);
}