mirror of
https://github.com/josdejong/mathjs.git
synced 2026-01-25 15:07:57 +00:00
105 lines
3.3 KiB
JavaScript
105 lines
3.3 KiB
JavaScript
'use strict';
|
|
|
|
module.exports = function (math, config) {
|
|
var bignumber = require('./util/bignumber');
|
|
var Complex = require('./type/Complex');
|
|
var BigNumber = math.type.BigNumber;
|
|
|
|
/**
|
|
* Calculate BigNumber e
|
|
* @returns {BigNumber} Returns e
|
|
*/
|
|
function bigE() {
|
|
return new BigNumber(1).exp();
|
|
}
|
|
|
|
/**
|
|
* Calculate BigNumber golden ratio, phi = (1+sqrt(5))/2
|
|
* @returns {BigNumber} Returns phi
|
|
*/
|
|
function bigPhi() {
|
|
return new BigNumber(1).plus(new BigNumber(5).sqrt()).div(2);
|
|
}
|
|
|
|
/**
|
|
* Calculate BigNumber pi
|
|
* @returns {BigNumber} Returns pi
|
|
*/
|
|
function bigPi() {
|
|
// the Bailey-Borwein-Plouffe formula
|
|
// http://stackoverflow.com/questions/4484489/using-basic-arithmetics-for-calculating-pi-with-arbitary-precision
|
|
var p16 = new BigNumber(1);
|
|
var k8 = new BigNumber(0);
|
|
var pi = new BigNumber(0);
|
|
|
|
var one = new BigNumber(1);
|
|
var two = new BigNumber(2);
|
|
var four = new BigNumber(4);
|
|
|
|
for(var k = new BigNumber(0); k.lte(config.precision); k = k.plus(1)) {
|
|
// pi += 1/p16 * (4/(8*k + 1) - 2/(8*k + 4) - 1/(8*k + 5) - 1/(8*k+6));
|
|
// p16 *= 16;
|
|
//
|
|
// a little simplified (faster):
|
|
// pi += p16 * (4/(8*k + 1) - 2/(8*k + 4) - 1/(8*k + 5) - 1/(8*k+6));
|
|
// p16 /= 16;
|
|
|
|
var f = four.div(k8.plus(1))
|
|
.minus(two.div(k8.plus(4)))
|
|
.minus(one.div(k8.plus(5)))
|
|
.minus(one.div(k8.plus(6)));
|
|
|
|
pi = pi.plus(p16.times(f));
|
|
p16 = p16.div(16);
|
|
k8 = k8.plus(8);
|
|
}
|
|
|
|
return pi;
|
|
}
|
|
|
|
/**
|
|
* Calculate BigNumber tau, tau = 2 * pi
|
|
* @returns {BigNumber} Returns tau
|
|
*/
|
|
function bigTau() {
|
|
// we calculate pi at a slightly higher precision than configured to prevent round off errors
|
|
// when multiplying by two in the end
|
|
BigNumber.config({precision: config.precision + 2});
|
|
|
|
var pi = bigPi();
|
|
|
|
BigNumber.config({precision: config.precision});
|
|
|
|
return new BigNumber(2).times(pi);
|
|
}
|
|
|
|
var big = config.number === 'bignumber';
|
|
|
|
// TODO: in case of support for defineProperty, we can lazy evaluate the BigNumber constants by creating them as properties (calculation of PI is slow for example)
|
|
math.pi = big ? bigPi() : Math.PI;
|
|
math.tau = big ? bigTau() : Math.PI * 2;
|
|
math.e = big ? bigE() : Math.E;
|
|
math.phi = big ? bigPhi() : 1.61803398874989484820458683436563811772030917980576286213545; // golden ratio, (1+sqrt(5))/2
|
|
|
|
math.i = new Complex(0, 1);
|
|
|
|
math['Infinity'] = Infinity;
|
|
math['NaN'] = NaN;
|
|
math['true'] = true;
|
|
math['false'] = false;
|
|
math['null'] = null;
|
|
|
|
// uppercase constants (for compatibility with built-in Math)
|
|
math.E = math.e;
|
|
math.LN2 = big ? new BigNumber(2).ln() : Math.LN2;
|
|
math.LN10 = big ? new BigNumber(10).ln() : Math.LN10;
|
|
math.LOG2E = big ? new BigNumber(1).div(new BigNumber(2).ln()) : Math.LOG2E;
|
|
math.LOG10E = big ? new BigNumber(1).div(new BigNumber(10).ln()) : Math.LOG10E;
|
|
math.PI = math.pi;
|
|
math.SQRT1_2 = big ? new BigNumber(0.5).sqrt() : Math.SQRT1_2;
|
|
math.SQRT2 = big ? new BigNumber(2).sqrt() : Math.SQRT2;
|
|
|
|
// meta information
|
|
math.version = require('./version');
|
|
};
|