mirror of
https://github.com/josdejong/mathjs.git
synced 2026-01-18 14:59:29 +00:00
110 lines
3.4 KiB
JavaScript
110 lines
3.4 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);
|
|
}
|
|
|
|
/**
|
|
* arctan(x) = x - x^3/3 + x^5/5 - x^7/7 + x^9/9 - ...
|
|
* = x - x^2*x^1/3 + x^2*x^3/5 - x^2*x^5/7 + x^2*x^7/9 - ...
|
|
* @param {BigNumber} x
|
|
* @returns {BigNumber} arc tangent of x
|
|
*/
|
|
function arctan(x) {
|
|
var y = x;
|
|
var yPrev = NaN;
|
|
var x2 = x.times(x);
|
|
var num = x;
|
|
var sign = -1;
|
|
|
|
for (var k = 3; !y.equals(yPrev); k += 2) {
|
|
num = num.times(x2);
|
|
|
|
yPrev = y;
|
|
y = (sign > 0) ? y.plus(num.div(k)) : y.minus(num.div(k));
|
|
sign = -sign;
|
|
}
|
|
|
|
return y;
|
|
}
|
|
|
|
/**
|
|
* Calculate BigNumber pi.
|
|
*
|
|
* Uses Machin's formula: pi / 4 = 4 * arctan(1 / 5) - arctan(1 / 239)
|
|
* http://milan.milanovic.org/math/english/pi/machin.html
|
|
* @returns {BigNumber} Returns pi
|
|
*/
|
|
function bigPi() {
|
|
// we calculate pi with a few decimal places extra to prevent round off issues
|
|
var Big = BigNumber.constructor({precision: BigNumber.precision + 4});
|
|
var pi4th = new Big(4).times(arctan(new Big(1).div(5)))
|
|
.minus(arctan(new Big(1).div(239)));
|
|
|
|
// the final pi has the requested number of decimals
|
|
return new BigNumber(4).times(pi4th);
|
|
}
|
|
|
|
/**
|
|
* 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');
|
|
};
|