# sum-series

Compute the sum of an infinite series.

## Usage

``````var sumSeries = require( '@stdlib/math/base/tools/sum-series' );
``````

#### sumSeries( generator[, options ] )

Computes the sum of the series given by the supplied `generator` argument. `generator` can be either an ES6 Generator object or a function which returns successive elements of the series at each invocation.

Using an ES6 Generator object:

``````var pow = require( '@stdlib/math/base/special/pow' );
var gen = geometricSeriesGenerator( 0.9 );
var out = sumSeries( gen );
// returns 10

function* geometricSeriesGenerator( x ) {
var exponent = 0;
while ( true ) {
yield pow( x, exponent );
exponent += 1;
}
}
``````

Alternatively, one can use a closure to achieve the same goal:

``````var pow = require( '@stdlib/math/base/special/pow' );
var gen = geometricSeriesClosure( 0.9 );
var out = sumSeries( gen );
// returns 10

function geometricSeriesClosure( x ) {
var exponent = -1;
return gen;

function gen() {
exponent += 1;
return pow( x, exponent );
}
}
``````

The `function` accepts the following `options`:

• maxTerms: integer denoting the maximum number of terms to be summed. Default: `1000000`.
• tolerance: number specifying the tolerance used to assess convergence. Default: `2.22e-16`.
• initialValue: number specifying the initial value of the returned sum. Default: `0`.

By default, the initial value of the sum is `0`. To choose a different one, use the `initialValue` option.

``````var pow = require( '@stdlib/math/base/special/pow' );

var out = sumSeries( geometricSeriesClosure( 0.5 ), {
'initialValue': 1
});
// returns 3

function geometricSeriesClosure( x ) {
var exponent = -1;
return gen;

function gen() {
exponent += 1;
return pow( x, exponent );
}
}
``````

To change the maximum number of terms to be summed, set the `maxTerms` option.

``````var pow = require( '@stdlib/math/base/special/pow' );

var out = sumSeries( geometricSeriesClosure( 0.5 ), {
'maxTerms': 10
});
// returns ~1.998 (infinite sum is 2)

function geometricSeriesClosure( x ) {
var exponent = -1;
return gen;

function gen() {
exponent += 1;
return pow( x, exponent );
}
}
``````

The default tolerance of `2.22e-16` used to assess convergence can be changed via the `tolerance` option.

``````var pow = require( '@stdlib/math/base/special/pow' );

var out = sumSeries( geometricSeriesClosure( 0.5 ), {
'tolerance': 1e-3
});
// returns ~1.998

function geometricSeriesClosure( x ) {
var exponent = -1;
return gen;

function gen() {
exponent += 1;
return pow( x, exponent );
}
}
``````

## Examples

``````var log1p = require( '@stdlib/math/base/special/log1p' );
var sumSeries = require( '@stdlib/math/base/tools/sum-series' );

function* log1pSeries( x ) {
var mMult = -x;
var mProd = -1;
var k = 0;
while ( true ) {
mProd *= mMult;
k += 1;
yield ( mProd / k );
}
}

console.log( 'log1p(0.5) evaluated via math-log1p module: %d', log1p( 0.5 ) );
console.log( 'log1p(0.5) evaluated via infinite series expansion: %d', sumSeries( log1pSeries( 0.5 ) ) );
``````