import { expect, assert } from 'chai'; import { describe } from 'mocha'; import { split, eEstimate, eCalculate } from '../../src/index.js'; import { isValid } from '../helpers/is-valid.js'; function check(sum: number[][][], res: number) { let result = eCalculate(sum); for (let term of sum) { for (let multiplicant of term) { assert( isValid(multiplicant), 'The first summand should not be an overlapping expansion.' ); } } expect(eEstimate(result)).to.eql(res); } describe('eCalculate', function() { it('should calculate correctly', function() { // zero should equal 0 check( [[[2**-8, 2**-4, 1]]], 1.06640625 ); // zero should equal 0 check( [[[0]]], 0 ); // zero times zero is still zero check( [[[0],[0]]], 0 ); // zero times zero add zero is again still zero check( [[[0],[0]], [[0]]], 0 ); // two times 3 plus 4 = 10 check( [[[2],[3]], [[4]]], 10 ); // 0.1 + 0.2 === 0.3ish check( [[[0.1]], [[0.2]]], 0.30000000000000004 ); // 0.1*0.2*100 + 1*2*3*4 + 3*2*1 = 32 check( [[[0.1],[0.2],[100]], [[1],[2],[3],[4]], [[3],[2],[1]]], 32 ); // 1*2*3 + 1*2*3*4 + 3*2*1 = 36 check( [[[1],[2],[3]], [[1],[2],[3],[4]], [[3],[2],[1]]], 36 ); // some complicated sum // 0.123421*0.1*0.2342234 + // 0.23345554*2.123123*3.76564*4.3462346 + // 3.2354123*2.1231232*1.123456789 = 15.83217927367012458725782448 check( [[[0.123421],[0.1],[0.2342234]], [[0.23345554],[2.123123],[3.76564],[4.3462346]], [[3.2354123],[2.1231232],[1.123456789]]], 15.83217927367012458725782448 ); // some more complicated sum // 0.123421*0.1*0.2342234 + // 0.23345554*2.123123*3.76564*4.3462346 + // 3.2354123*2.1231232*1.123456789 = 15.83217927367012458725782448 check( [ [split(0.123421).reverse(), split(0.1).reverse(), split(0.2342234).reverse()], [split(0.23345554).reverse(), split(2.123123).reverse(), split(3.76564).reverse(), split(4.3462346).reverse()], [split(3.2354123).reverse(), split(2.1231232).reverse(), split(1.123456789).reverse()] ], 15.83217927367012458725782448 ); // zero should equal 0 check( [[ [1], [2**-8, 2**-4, 1] ]], 1.06640625 ); }); });