continued-fraction

Continued fraction approximation.

Usage

var continuedFraction = require( '@stdlib/math/base/tools/continued-fraction' );

continuedFraction( generator[, options ] )

Evaluates the continued fraction described by the supplied generator argument. generator can be either a function which returns an array with two elements, the a and b terms of the fraction, or an ES6 Generator object. By default, the function computes

ContinuedFraction a 1 Over b 1 plus StartFraction a 2 Over b 2 plus StartFraction a 3 Over b 3 plus StartFraction a 4 Over b 4 EndFraction plus ellipsis

Using an ES6 Generator object:

// Continued fraction for (e-1)^(-1):
var gen = generator();
var out = continuedFraction( gen );
// returns ~0.582

function* generator() {
    var i = 0;
    while ( true ) {
        i += 1;
        yield [ i, i ];
    }
}

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

// Continued fraction for (e-1)^(-1):
var gen = generator();
var out = continuedFraction( gen );
// returns ~0.582

function generator() {
    var i = 0;
    return gen;

    function gen() {
        i += 1;
        return [ i, i ];
    }
}

The function accepts the following options:

  • maxIter: integer denoting the maximum number of times the supplied generator object will be called. Default: 1000000.
  • tolerance: number primitive specifying the used tolerance to assess convergence. Default: 2.22e-16.
  • keep: boolean primitive indicating whether to keep the b0 term in the continued fraction. Default: false.

To evaluate

b 0 plus ContinuedFraction a 1 Over b 1 plus StartFraction a 2 Over b 2 plus StartFraction a 3 Over b 3 plus StartFraction a 4 Over b 4 EndFraction plus ellipsis

set the keep option to true.

var out = continuedFraction( generator(), {
    'keep': true
});
// returns ~1.718

function generator() {
    var i = 0;
    return gen;

    function gen() {
        i += 1;
        return [ i, i ];
    }
}

To change the maximum number of iterations, set the maxIter option.

var out = continuedFraction( generator(), {
    'maxIter': 10
});
// returns ~0.582

function generator() {
    var i = 0;
    return gen;

    function gen() {
        i += 1;
        return [ i, i ];
    }
}

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

var out = continuedFraction( generator(), {
    'tolerance': 1e-1
});
// returns ~0.579

function generator() {
    var i = 0;
    return gen;

    function gen() {
        i += 1;
        return [ i, i ];
    }
}

Examples

var continuedFraction = require( '@stdlib/math/base/tools/continued-fraction' );
var out;

function* generator() {
    while ( true ) {
        yield [ 1, 1 ];
    }
}

function closure() {
    var ones = [ 1, 1 ];
    return gen;

    function gen() {
        return ones;
    }
}

out = continuedFraction( generator(), {
    'keep': true
});
console.log( 'Golden ratio (generator): %d,', out );

out = continuedFraction( closure(), {
    'keep': true
});
console.log( 'Golden ratio (closure): %d', out );
Did you find this page helpful?