locutus
Version:
Locutus other languages' standard libraries to JavaScript for fun and educational purposes
35 lines (34 loc) • 1.38 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.isclose = isclose;
function isclose(a, b, relTol = 1e-9, absTol = 0) {
// discuss at: https://locutus.io/python/isclose/
// parity verified: Python 3.12
// original by: Kevin van Zonneveld (https://kvz.io)
// note 1: Tests whether two numbers are close within relative/absolute tolerances.
// example 1: isclose(0.1 + 0.2, 0.3)
// returns 1: true
// example 2: isclose(1000.0, 1001.0, 0.01)
// returns 2: true
// example 3: isclose(1.0, 1.1, 1e-9, 0)
// returns 3: false
const left = Number(a);
const right = Number(b);
const relative = Number(relTol);
const absolute = Number(absTol);
if (!Number.isFinite(relative) || !Number.isFinite(absolute) || relative < 0 || absolute < 0) {
throw new RangeError('isclose(): tolerances must be non-negative finite numbers');
}
if (Number.isNaN(left) || Number.isNaN(right)) {
return false;
}
if (left === right) {
return true;
}
if (!Number.isFinite(left) || !Number.isFinite(right)) {
return false;
}
const difference = Math.abs(left - right);
const threshold = Math.max(relative * Math.max(Math.abs(left), Math.abs(right)), absolute);
return difference <= threshold;
}