UNPKG

locutus

Version:

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

33 lines (32 loc) 1.03 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.fsum = fsum; function fsum(...values) { // discuss at: https://locutus.io/python/fsum/ // parity verified: Python 3.12 // original by: Kevin van Zonneveld (https://kvz.io) // note 1: Uses compensated summation for better floating-point precision than naive accumulation. // example 1: fsum(1e16, 1, -1e16) // returns 1: 1 // example 2: fsum(0.1, 0.2, 0.3) // returns 2: 0.6 // example 3: fsum(1, 2, 3, 4) // returns 3: 10 let sum = 0; let compensation = 0; for (const value of values) { const x = Number(value); if (Number.isNaN(x)) { return Number.NaN; } const t = sum + x; if (Math.abs(sum) >= Math.abs(x)) { compensation += sum - t + x; } else { compensation += x - t + sum; } sum = t; } return sum + compensation; }