jiangchengfeiyi-xiaochengxu/node_modules/mathjs/lib/cjs/utils/bignumber/nearlyEqual.js
2025-01-02 11:13:50 +08:00

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));
}