UNPKG

locutus

Version:

Locutus other languages' standard libraries to JavaScript for fun and educational purposes

35 lines (34 loc) 1.38 kB
"use strict"; 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; }