45 lines
1.7 KiB
JavaScript
45 lines
1.7 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.nearlyEqual = nearlyEqual;
|
|
/**
|
|
* Compares two BigNumbers.
|
|
* @param {BigNumber} a - First value to compare
|
|
* @param {BigNumber} b - Second value to compare
|
|
* @param {number} [relTol=1e-09] - The relative tolerance, indicating the maximum allowed difference relative to the larger absolute value. Must be greater than 0.
|
|
* @param {number} [absTol=0] - The minimum absolute tolerance, useful for comparisons near zero. Must be at least 0.
|
|
* @returns {boolean} whether the two numbers are nearly equal
|
|
* @throws {Error} If `relTol` is less than or equal to 0.
|
|
* @throws {Error} If `absTol` is less than 0.
|
|
*
|
|
* @example
|
|
* nearlyEqual(1.000000001, 1.0, 1e-9); // true
|
|
* nearlyEqual(1.000000002, 1.0, 0); // false
|
|
* nearlyEqual(1.0, 1.009, undefined, 0.02); // true
|
|
* nearlyEqual(0.000000001, 0.0, undefined, 1e-8); // true
|
|
*/
|
|
function nearlyEqual(a, b) {
|
|
let relTol = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : 1e-9;
|
|
let absTol = arguments.length > 3 && arguments[3] !== undefined ? arguments[3] : 0;
|
|
if (relTol <= 0) {
|
|
throw new Error('Relative tolerance must be greater than 0');
|
|
}
|
|
if (absTol < 0) {
|
|
throw new Error('Absolute tolerance must be at least 0');
|
|
}
|
|
// NaN
|
|
if (a.isNaN() || b.isNaN()) {
|
|
return false;
|
|
}
|
|
if (!a.isFinite() || !b.isFinite()) {
|
|
return a.eq(b);
|
|
}
|
|
// use "==" operator, handles infinities
|
|
if (a.eq(b)) {
|
|
return true;
|
|
}
|
|
// abs(a-b) <= max(relTol * max(abs(a), abs(b)), absTol)
|
|
return a.minus(b).abs().lte(a.constructor.max(a.constructor.max(a.abs(), b.abs()).mul(relTol), absTol));
|
|
} |