diff --git a/HISTORY.md b/HISTORY.md index 8c5d78e1f..da104c5d8 100644 --- a/HISTORY.md +++ b/HISTORY.md @@ -2,8 +2,10 @@ https://github.com/josdejong/mathjs -## not yet released, version 0.19.1 +## not yet released, version 0.20.0 +- Switched to module `decimal.js` for BigNumber support, instead of + `bignumber.js`. - Implemented conditional operator `a ? b : c` in expression parser. - Improved function `ifElse`, is now specified for special data types too. - Minor bug fixes. diff --git a/docs/configuration.md b/docs/configuration.md index eb7da5f40..bcecc4303 100644 --- a/docs/configuration.md +++ b/docs/configuration.md @@ -16,19 +16,14 @@ Available configuration settings are: like `eval `which cannot determine the correct type of output from the functions input. For most functions though, the type of output is determined from the the input: a number as input will return a number as output, - a bignumber as input returns a bignumber as output. + a BigNumber as input returns a BigNumber as output. Available values are: `'number'` (default) or `'bignumber'`. - Big numbers have higher precision than the default numbers of JavaScript. + BigNumbers have higher precision than the default numbers of JavaScript. - `decimals`. The maximum number of decimal places behind the decimal - point (not the number of significant digits). Only applies to big numbers, + point (not the number of significant digits). Only applies to BigNumbers, not to numbers. Default value is 20. - *Important: This setting is applied application wide to all BigNumbers. - Behind the scenes, this setting is applied as the global `DECIMAL_PLACES` - setting of the [bignumber.js](https://github.com/MikeMcl/bignumber.js) - library used by math.js.* - ## Examples @@ -72,13 +67,13 @@ math2.config({ math2.range(0, 4); // Matrix [0, 1, 2, 3] ``` -### Configuration for big numbers +### Configuration for BigNumbers ```js // load the library var mathjs = require('mathjs'); -// use big numbers by default +// use BigNumbers by default var math3 = mathjs({ number: 'bignumber', decimals: 32 diff --git a/docs/datatypes/bignumbers.md b/docs/datatypes/bignumbers.md index 07b6537f6..7f8c015ef 100644 --- a/docs/datatypes/bignumbers.md +++ b/docs/datatypes/bignumbers.md @@ -1,33 +1,36 @@ -# Big Numbers +# BigNumbers -For calculations with an arbitrary precision, math.js supports BigNumber. -BigNumber is powered by the the library -[bignumber.js](https://github.com/MikeMcl/bignumber.js/). +For calculations with an arbitrary precision, math.js supports a `BigNumber` +data type. BigNumber support is powered by +[decimal.js](https://github.com/MikeMcl/decimal.js/). -A big number can be created using the function `bignumber`: +A BigNumber can be created using the function `bignumber`: ```js math.bignumber('2.3e+500'); // BigNumber, 2.3e+500 ``` Most functions can determine the type of output from the type of input: -a number as input will return a number as output, a bignumber as input returns -a bignumber as output. Functions which cannot determine the type of output +a number as input will return a number as output, a BigNumber as input returns +a BigNumber as output. Functions which cannot determine the type of output from the input (for example `math.eval`) use the default number type `number`, -which can be configured when instantiating math.js. To configure the use of big -numbers instead of [numbers](numbers.md) by default, configure math.js like: +which can be configured when instantiating math.js. To configure the use of +BigNumbers instead of [numbers](numbers.md) by default, configure math.js like: ```js var mathjs = require('mathjs'), math = mathjs({ number: 'bignumber', // Default type of number: 'number' (default) or 'bignumber' - decimals: 20 // Number decimal places behind the dot for big numbers + decimals: 20 // Number of decimal places behind the dot for BigNumbers }); // use math math.eval('0.1 + 0.2'); // BigNumber, 0.3 ``` +The default precision for BigNumber is 20 digits, and can be configured with +the option `decimals`. + *Important: BigNumber is not supported by the following functions: exp, gcd, lcm, log, log10, xgcd, @@ -45,29 +48,18 @@ precision, it is less likely that round-off errors occur: math.add(0.1, 0.2); // Number, 0.30000000000000004 math.divide(0.3, 0.2); // Number, 1.4999999999999998 -// no round-off errors with big numbers :) +// no round-off errors with BigNumbers :) math.add(math.bignumber(0.1), math.bignumber(0.2)); // BigNumber, 0.3 math.divide(math.bignumber(0.3), math.bignumber(0.2)); // BigNumber, 1.5 ``` -The default precision for BigNumber is 20 digits. This is a global setting -in the [underlying BigNumber library](https://github.com/MikeMcl/bignumber.js/), -which can be changed by configuring BigNumber: - -```js -BigNumber.config({DECIMAL_PLACES: 32}); -``` - -*Important: To work with small numbers, `DECIMAL_PLACES` must be configured -sufficiently large.* - -Big numbers can be converted to numbers and vice versa using the functions +BigNumbers can be converted to numbers and vice versa using the functions `number` and `bignumber`. When converting a BigNumber to a Number, the high precision of the BigNumber will be lost. When a BigNumber is too large to be represented as Number, it will be initialized as `Infinity`. ```js -// converting numbers and bignumbers +// converting numbers and BigNumbers var a = math.number(0.3); // Number, 0.3 var b = math.bignumber(a); // BigNumber, 0.3 var c = math.number(b); // Number, 0.3 diff --git a/docs/datatypes/index.md b/docs/datatypes/index.md index 72509ea9e..13e5b64c7 100644 --- a/docs/datatypes/index.md +++ b/docs/datatypes/index.md @@ -24,7 +24,7 @@ math.subtract(7.1, 2.3); // 4.8 math.round(math.pi, 3); // 3.142 math.sqrt(4.41e2); // 21 -// use big numbers +// use BigNumbers math.add(math.bignumber(0.1), math.bignumber(0.2)); // BigNumber, 0.3 // use strings diff --git a/docs/datatypes/numbers.md b/docs/datatypes/numbers.md index d734e9339..256d0fdb3 100644 --- a/docs/datatypes/numbers.md +++ b/docs/datatypes/numbers.md @@ -4,11 +4,11 @@ Math.js supports two types of numbers: - Number for fast floating point arithmetic, described on this page. - BigNumber for arbitrary precision arithmetic, describe on the page - [Big Numbers](bignumbers.md). + [BigNumbers](bignumbers.md). Most functions can determine the type of output from the type of input: -a number as input will return a number as output, a bignumber as input returns -a bignumber as output. Functions which cannot determine the type of output +a number as input will return a number as output, a BigNumber as input returns +a BigNumber as output. Functions which cannot determine the type of output from the input (for example `math.eval`) use the default number type, which can be configured when instantiating math.js: diff --git a/docs/expressions.md b/docs/expressions.md index 57eb6925a..db839eb96 100644 --- a/docs/expressions.md +++ b/docs/expressions.md @@ -456,9 +456,9 @@ math.format(ans, {precision: 14}); // "0.3" ``` -#### Big numbers +#### BigNumbers -Math.js supports big numbers for calculations with an arbitrary precision. +Math.js supports BigNumbers for calculations with an arbitrary precision. The pros and cons of Number and BigNumber are explained in detail on the page [Numbers](datatypes/numbers.md). @@ -484,7 +484,7 @@ var mathjs = require('mathjs'), math.eval('0.1 + 0.2'); // BigNumber, 0.3 ``` -Big numbers can be converted to numbers and vice versa using the functions +BigNumbers can be converted to numbers and vice versa using the functions `number` and `bignumber`. When converting a BigNumber to a Number, the high precision of the BigNumber will be lost. When a BigNumber is too large to be represented as Number, it will be initialized as `Infinity`. diff --git a/docs/index.md b/docs/index.md index 5460b93cc..b26e6a95a 100644 --- a/docs/index.md +++ b/docs/index.md @@ -7,7 +7,7 @@ - [Chained Operations](chained_operations.md) - [Data Types](datatypes/index.md) - [Numbers](datatypes/numbers.md) - - [Big Numbers](datatypes/bignumbers.md) + - [BigNumbers](datatypes/bignumbers.md) - [Complex Numbers](datatypes/complex_numbers.md) - [Matrices](datatypes/matrices.md) - [Units](datatypes/units.md) diff --git a/examples/bignumbers.js b/examples/bignumbers.js index e5f2a5725..a163657e0 100644 --- a/examples/bignumbers.js +++ b/examples/bignumbers.js @@ -1,11 +1,11 @@ -// big numbers +// BigNumbers // load math.js and create an instance -// the default type of numbers is configured as big numbers +// the default type of numbers is configured as BigNumbers var mathjs = require('../index'), math = mathjs({ number: 'bignumber', // Default type of number: 'number' (default) or 'bignumber' - decimals: 20 // number decimal places behind the dot for big numbers + decimals: 20 // number of decimal places behind the dot for BigNumbers }); /** @@ -21,19 +21,19 @@ print(math.add(0.1, 0.2)); // Number, 0.30000000000000004 print(math.divide(0.3, 0.2)); // Number, 1.4999999999999998 console.log(); -console.log('no round-off errors with big numbers'); +console.log('no round-off errors with BigNumbers'); print(math.add(math.bignumber(0.1), math.bignumber(0.2))); // BigNumber, 0.3 print(math.divide(math.bignumber(0.3), math.bignumber(0.2))); // BigNumber, 1.5 console.log(); -console.log('create big numbers from strings when exceeding the range of a number'); +console.log('create BigNumbers from strings when exceeding the range of a number'); print(math.bignumber(1.2e+500)); // BigNumber, Infinity WRONG print(math.bignumber('1.2e+500')); // BigNumber, 1.2e+500 console.log(); -// one can work conveniently with big numbers using the expression parser. -// note though that big numbers are only supported in arithmetic functions -console.log('use big numbers in the expression parser'); +// one can work conveniently with BigNumbers using the expression parser. +// note though that BigNumbers are only supported in arithmetic functions +console.log('use BigNumbers in the expression parser'); print(math.eval('0.1 + 0.2')); // BigNumber, 0.3 print(math.eval('0.3 / 0.2')); // BigNumber, 1.5 console.log(); diff --git a/lib/expression/node/ConstantNode.js b/lib/expression/node/ConstantNode.js index 51dd0ceae..261081516 100644 --- a/lib/expression/node/ConstantNode.js +++ b/lib/expression/node/ConstantNode.js @@ -1,6 +1,6 @@ var Node = require('./Node'), Complex = require('../../type/Complex'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), string = require('../../util/string'), isString = string.isString; diff --git a/lib/expression/node/IndexNode.js b/lib/expression/node/IndexNode.js index 837c85f81..0c9f642b1 100644 --- a/lib/expression/node/IndexNode.js +++ b/lib/expression/node/IndexNode.js @@ -1,12 +1,12 @@ -var number= require('../../util/number.js'), +var number= require('../../util/number'), Node = require('./Node.js'), - RangeNode = require('./RangeNode.js'), - SymbolNode = require('./SymbolNode.js'), + RangeNode = require('./RangeNode'), + SymbolNode = require('./SymbolNode'), - BigNumber = require('bignumber.js'), - Index = require('../../type/Index.js'), - Range = require('../../type/Range.js'), + BigNumber = require('../../type/BigNumber'), + Index = require('../../type/Index'), + Range = require('../../type/Range'), isNumber = number.isNumber, toNumber = number.toNumber, diff --git a/lib/expression/node/ParamsNode.js b/lib/expression/node/ParamsNode.js index be1481925..aabb92a73 100644 --- a/lib/expression/node/ParamsNode.js +++ b/lib/expression/node/ParamsNode.js @@ -4,7 +4,7 @@ var number= require('../../util/number'), RangeNode = require('./RangeNode'), SymbolNode = require('./SymbolNode'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Index = require('../../type/Index'), Range = require('../../type/Range'), diff --git a/lib/expression/node/RangeNode.js b/lib/expression/node/RangeNode.js index befea2fc0..84561150f 100644 --- a/lib/expression/node/RangeNode.js +++ b/lib/expression/node/RangeNode.js @@ -1,7 +1,7 @@ var number = require('../../util/number'), Node = require('./Node'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Range = require('../../type/Range'), Matrix = require('../../type/Matrix'), diff --git a/lib/expression/node/UnitNode.js b/lib/expression/node/UnitNode.js index a0533deb2..145179e92 100644 --- a/lib/expression/node/UnitNode.js +++ b/lib/expression/node/UnitNode.js @@ -1,6 +1,6 @@ var Node = require('./Node'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), diff --git a/lib/expression/node/UpdateNode.js b/lib/expression/node/UpdateNode.js index 1b8cdca8d..b6c942ea2 100644 --- a/lib/expression/node/UpdateNode.js +++ b/lib/expression/node/UpdateNode.js @@ -5,7 +5,7 @@ var number= require('../../util/number'), IndexNode = require('./IndexNode'), SymbolNode = require('./SymbolNode'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Index = require('../../type/Index'), Range = require('../../type/Range'), diff --git a/lib/function/arithmetic/abs.js b/lib/function/arithmetic/abs.js index 92714cbee..91129d3da 100644 --- a/lib/function/arithmetic/abs.js +++ b/lib/function/arithmetic/abs.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Matrix = require('../../type/Matrix'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/add.js b/lib/function/arithmetic/add.js index 46e2a743a..4be5bf42c 100644 --- a/lib/function/arithmetic/add.js +++ b/lib/function/arithmetic/add.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Matrix = require('../../type/Matrix'), Unit = require('../../type/Unit'), diff --git a/lib/function/arithmetic/ceil.js b/lib/function/arithmetic/ceil.js index daf5b7106..8e8c9890a 100644 --- a/lib/function/arithmetic/ceil.js +++ b/lib/function/arithmetic/ceil.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/compare.js b/lib/function/arithmetic/compare.js index dc3524bb6..935ef66aa 100644 --- a/lib/function/arithmetic/compare.js +++ b/lib/function/arithmetic/compare.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/cube.js b/lib/function/arithmetic/cube.js index bb8b37b2b..9dd048b64 100644 --- a/lib/function/arithmetic/cube.js +++ b/lib/function/arithmetic/cube.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/divide.js b/lib/function/arithmetic/divide.js index 9cec46cab..9bb7fe5cd 100644 --- a/lib/function/arithmetic/divide.js +++ b/lib/function/arithmetic/divide.js @@ -1,7 +1,7 @@ module.exports = function(math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Matrix = require('../../type/Matrix'), Unit = require('../../type/Unit'), diff --git a/lib/function/arithmetic/equal.js b/lib/function/arithmetic/equal.js index 933763998..cfb13811d 100644 --- a/lib/function/arithmetic/equal.js +++ b/lib/function/arithmetic/equal.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/exp.js b/lib/function/arithmetic/exp.js index 4697e89d8..9bde185b9 100644 --- a/lib/function/arithmetic/exp.js +++ b/lib/function/arithmetic/exp.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Matrix = require('../../type/Matrix'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/fix.js b/lib/function/arithmetic/fix.js index 11a9f9067..54a8e7fb8 100644 --- a/lib/function/arithmetic/fix.js +++ b/lib/function/arithmetic/fix.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/floor.js b/lib/function/arithmetic/floor.js index 6028d4b39..83e00b3e2 100644 --- a/lib/function/arithmetic/floor.js +++ b/lib/function/arithmetic/floor.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/gcd.js b/lib/function/arithmetic/gcd.js index 34a03603d..1f5b4a886 100644 --- a/lib/function/arithmetic/gcd.js +++ b/lib/function/arithmetic/gcd.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), collection = require('../../type/collection'), isNumber = util.number.isNumber, diff --git a/lib/function/arithmetic/larger.js b/lib/function/arithmetic/larger.js index 899f1e533..314a49421 100644 --- a/lib/function/arithmetic/larger.js +++ b/lib/function/arithmetic/larger.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/largereq.js b/lib/function/arithmetic/largereq.js index a88263002..82ca9cac9 100644 --- a/lib/function/arithmetic/largereq.js +++ b/lib/function/arithmetic/largereq.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/lcm.js b/lib/function/arithmetic/lcm.js index 31f2e273c..22438bd6f 100644 --- a/lib/function/arithmetic/lcm.js +++ b/lib/function/arithmetic/lcm.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), collection = require('../../type/collection'), isNumber = util.number.isNumber, diff --git a/lib/function/arithmetic/log.js b/lib/function/arithmetic/log.js index d881c6990..f84f81bdf 100644 --- a/lib/function/arithmetic/log.js +++ b/lib/function/arithmetic/log.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/log10.js b/lib/function/arithmetic/log10.js index 9d4b31cc8..916a1c1de 100644 --- a/lib/function/arithmetic/log10.js +++ b/lib/function/arithmetic/log10.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/mod.js b/lib/function/arithmetic/mod.js index 4c6a18d82..f1cadaef0 100644 --- a/lib/function/arithmetic/mod.js +++ b/lib/function/arithmetic/mod.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), collection = require('../../type/collection'), isNumber = util.number.isNumber, diff --git a/lib/function/arithmetic/multiply.js b/lib/function/arithmetic/multiply.js index 428bc49ba..5ede71f12 100644 --- a/lib/function/arithmetic/multiply.js +++ b/lib/function/arithmetic/multiply.js @@ -1,7 +1,7 @@ module.exports = function(math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Matrix = require('../../type/Matrix'), Unit = require('../../type/Unit'), diff --git a/lib/function/arithmetic/pow.js b/lib/function/arithmetic/pow.js index d1d7ebc06..a6f9b2987 100644 --- a/lib/function/arithmetic/pow.js +++ b/lib/function/arithmetic/pow.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Matrix = require('../../type/Matrix'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/round.js b/lib/function/arithmetic/round.js index 61be56258..f9894dc2e 100644 --- a/lib/function/arithmetic/round.js +++ b/lib/function/arithmetic/round.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), @@ -43,7 +43,7 @@ module.exports = function (math) { } if (x instanceof BigNumber) { - return x.round(); + return x.toDecimalPlaces(0); } if (isCollection(x)) { @@ -85,7 +85,7 @@ module.exports = function (math) { } if (x instanceof BigNumber) { - return x.round(n); + return x.toDecimalPlaces(n); } if (isCollection(x) || isCollection(n)) { diff --git a/lib/function/arithmetic/sign.js b/lib/function/arithmetic/sign.js index 518bdb3f8..5333fc7b9 100644 --- a/lib/function/arithmetic/sign.js +++ b/lib/function/arithmetic/sign.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/smaller.js b/lib/function/arithmetic/smaller.js index 1c1cfe036..c1ef6648d 100644 --- a/lib/function/arithmetic/smaller.js +++ b/lib/function/arithmetic/smaller.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/smallereq.js b/lib/function/arithmetic/smallereq.js index 223f62231..436847197 100644 --- a/lib/function/arithmetic/smallereq.js +++ b/lib/function/arithmetic/smallereq.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/sqrt.js b/lib/function/arithmetic/sqrt.js index 2c5fc8831..7f7aa18c9 100644 --- a/lib/function/arithmetic/sqrt.js +++ b/lib/function/arithmetic/sqrt.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/square.js b/lib/function/arithmetic/square.js index 603fb569e..1077682cb 100644 --- a/lib/function/arithmetic/square.js +++ b/lib/function/arithmetic/square.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/subtract.js b/lib/function/arithmetic/subtract.js index 155d75845..e00cc2bc3 100644 --- a/lib/function/arithmetic/subtract.js +++ b/lib/function/arithmetic/subtract.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Matrix = require('../../type/Matrix'), Unit = require('../../type/Unit'), diff --git a/lib/function/arithmetic/unary.js b/lib/function/arithmetic/unary.js index 939f22208..a55be06aa 100644 --- a/lib/function/arithmetic/unary.js +++ b/lib/function/arithmetic/unary.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/unequal.js b/lib/function/arithmetic/unequal.js index d94507e7b..0c7c0c397 100644 --- a/lib/function/arithmetic/unequal.js +++ b/lib/function/arithmetic/unequal.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/arithmetic/xgcd.js b/lib/function/arithmetic/xgcd.js index 3f17f0877..d00c13506 100644 --- a/lib/function/arithmetic/xgcd.js +++ b/lib/function/arithmetic/xgcd.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), toNumber = util.number.toNumber, isNumber = util.number.isNumber, diff --git a/lib/function/complex/arg.js b/lib/function/complex/arg.js index 115671910..695cc1b78 100644 --- a/lib/function/complex/arg.js +++ b/lib/function/complex/arg.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/complex/conj.js b/lib/function/complex/conj.js index be4b855a1..3d151a213 100644 --- a/lib/function/complex/conj.js +++ b/lib/function/complex/conj.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/complex/im.js b/lib/function/complex/im.js index 6e8aa4bd3..a059e45fc 100644 --- a/lib/function/complex/im.js +++ b/lib/function/complex/im.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/complex/re.js b/lib/function/complex/re.js index c16c8cd9f..37c6d3b0d 100644 --- a/lib/function/complex/re.js +++ b/lib/function/complex/re.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/construction/bignumber.js b/lib/function/construction/bignumber.js index 0631d58f6..5e83f59c1 100644 --- a/lib/function/construction/bignumber.js +++ b/lib/function/construction/bignumber.js @@ -1,7 +1,8 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + // create a non-global instance of BigNumber + BigNumber = require('../../type/BigNumber'), collection = require('../../type/collection'), isCollection = collection.isCollection, diff --git a/lib/function/construction/boolean.js b/lib/function/construction/boolean.js index 12e95ed2e..62dd5ee68 100644 --- a/lib/function/construction/boolean.js +++ b/lib/function/construction/boolean.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), collection = require('../../type/collection'), isCollection = collection.isCollection, diff --git a/lib/function/construction/complex.js b/lib/function/construction/complex.js index 74dafb0e3..4270e66f2 100644 --- a/lib/function/construction/complex.js +++ b/lib/function/construction/complex.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/construction/index.js b/lib/function/construction/index.js index fd8d6b710..52da4ba4e 100644 --- a/lib/function/construction/index.js +++ b/lib/function/construction/index.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Index = require('../../type/Index'), toNumber = util.number.toNumber; diff --git a/lib/function/construction/number.js b/lib/function/construction/number.js index 63f4c5933..a06cd2b29 100644 --- a/lib/function/construction/number.js +++ b/lib/function/construction/number.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), collection = require('../../type/collection'), isCollection = collection.isCollection, diff --git a/lib/function/construction/unit.js b/lib/function/construction/unit.js index cfba18e68..585a192eb 100644 --- a/lib/function/construction/unit.js +++ b/lib/function/construction/unit.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/matrix/eye.js b/lib/function/matrix/eye.js index dcc23c765..fc2090b30 100644 --- a/lib/function/matrix/eye.js +++ b/lib/function/matrix/eye.js @@ -1,7 +1,7 @@ module.exports = function (math, settings) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Matrix = require('../../type/Matrix'), collection = require('../../type/collection'), diff --git a/lib/function/matrix/ones.js b/lib/function/matrix/ones.js index 2882c9af9..ade4aa3ea 100644 --- a/lib/function/matrix/ones.js +++ b/lib/function/matrix/ones.js @@ -1,7 +1,7 @@ module.exports = function (math, settings) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Matrix = require('../../type/Matrix'), collection = require('../../type/collection'), diff --git a/lib/function/matrix/range.js b/lib/function/matrix/range.js index 456a38241..b5b45d645 100644 --- a/lib/function/matrix/range.js +++ b/lib/function/matrix/range.js @@ -1,7 +1,7 @@ module.exports = function (math, settings) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Matrix = require('../../type/Matrix'), collection = require('../../type/collection'), diff --git a/lib/function/matrix/resize.js b/lib/function/matrix/resize.js index 6c01455a7..962867445 100644 --- a/lib/function/matrix/resize.js +++ b/lib/function/matrix/resize.js @@ -1,7 +1,7 @@ module.exports = function (math, settings) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Matrix = require('../../type/Matrix'), array = util.array, diff --git a/lib/function/matrix/size.js b/lib/function/matrix/size.js index 75d21c69e..f7f323beb 100644 --- a/lib/function/matrix/size.js +++ b/lib/function/matrix/size.js @@ -1,7 +1,7 @@ module.exports = function (math, settings) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), Matrix = require('../../type/Matrix'), diff --git a/lib/function/matrix/zeros.js b/lib/function/matrix/zeros.js index dbddb0952..50c1eeb85 100644 --- a/lib/function/matrix/zeros.js +++ b/lib/function/matrix/zeros.js @@ -1,7 +1,7 @@ module.exports = function (math, settings) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Matrix = require('../../type/Matrix'), collection = require('../../type/collection'), diff --git a/lib/function/probability/combinations.js b/lib/function/probability/combinations.js index 509aa18ae..69aee7a75 100644 --- a/lib/function/probability/combinations.js +++ b/lib/function/probability/combinations.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), collection = require('../../type/collection'), isNumber = util.number.isNumber, @@ -74,6 +74,6 @@ module.exports = function (math) { * @returns {boolean} isPositiveInteger */ var isPositiveInteger = function(n) { - return n.round().equals(n) && n.gte(0); + return n.isInteger() && n.gte(0); }; }; diff --git a/lib/function/probability/factorial.js b/lib/function/probability/factorial.js index 96a8ef242..6b58b4ecc 100644 --- a/lib/function/probability/factorial.js +++ b/lib/function/probability/factorial.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), collection = require('../../type/collection'), isNumber = util.number.isNumber, @@ -85,6 +85,6 @@ module.exports = function (math) { * @returns {boolean} isPositiveInteger */ var isPositiveInteger = function(n) { - return n.round().equals(n) && n.gte(0); + return n.isInteger() && n.gte(0); }; }; diff --git a/lib/function/probability/permutations.js b/lib/function/probability/permutations.js index 6ea976c30..def2d2a12 100644 --- a/lib/function/probability/permutations.js +++ b/lib/function/probability/permutations.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), isNumber = util.number.isNumber, isInteger = util.number.isInteger, @@ -89,6 +89,6 @@ module.exports = function (math) { * @returns {boolean} isPositiveInteger */ var isPositiveInteger = function(n) { - return n.round().equals(n) && n.gte(0); + return n.isInteger() && n.gte(0); }; }; diff --git a/lib/function/statistics/median.js b/lib/function/statistics/median.js index e9dc39770..f500ab918 100644 --- a/lib/function/statistics/median.js +++ b/lib/function/statistics/median.js @@ -1,7 +1,7 @@ module.exports = function (math) { var Matrix = require('../../type/Matrix'), Unit = require('../../type/Unit'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), collection = require('../../type/collection'), isNumber = require('../../util/number').isNumber, diff --git a/lib/function/statistics/var.js b/lib/function/statistics/var.js index ae0605876..a4511fb1a 100644 --- a/lib/function/statistics/var.js +++ b/lib/function/statistics/var.js @@ -1,6 +1,6 @@ module.exports = function (math) { var Matrix = require('../../type/Matrix'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), collection = require('../../type/collection'), isCollection = collection.isCollection, diff --git a/lib/function/trigonometry/acos.js b/lib/function/trigonometry/acos.js index 457da16ac..608c02460 100644 --- a/lib/function/trigonometry/acos.js +++ b/lib/function/trigonometry/acos.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/trigonometry/asin.js b/lib/function/trigonometry/asin.js index 36781d32e..ff28c856b 100644 --- a/lib/function/trigonometry/asin.js +++ b/lib/function/trigonometry/asin.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/trigonometry/atan.js b/lib/function/trigonometry/atan.js index 4f35506f6..26ceee5b1 100644 --- a/lib/function/trigonometry/atan.js +++ b/lib/function/trigonometry/atan.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/trigonometry/atan2.js b/lib/function/trigonometry/atan2.js index d872d636a..1f62d80c9 100644 --- a/lib/function/trigonometry/atan2.js +++ b/lib/function/trigonometry/atan2.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), collection = require('../../type/collection'), diff --git a/lib/function/trigonometry/cos.js b/lib/function/trigonometry/cos.js index ed384ef2c..9c3ea2103 100644 --- a/lib/function/trigonometry/cos.js +++ b/lib/function/trigonometry/cos.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/trigonometry/cot.js b/lib/function/trigonometry/cot.js index 087bf8f6e..76313d830 100644 --- a/lib/function/trigonometry/cot.js +++ b/lib/function/trigonometry/cot.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/trigonometry/csc.js b/lib/function/trigonometry/csc.js index f70cc1a79..7f6f0ec89 100644 --- a/lib/function/trigonometry/csc.js +++ b/lib/function/trigonometry/csc.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/trigonometry/sec.js b/lib/function/trigonometry/sec.js index 4c9f366be..96e020316 100644 --- a/lib/function/trigonometry/sec.js +++ b/lib/function/trigonometry/sec.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/trigonometry/sin.js b/lib/function/trigonometry/sin.js index 3f299174c..4252153ea 100644 --- a/lib/function/trigonometry/sin.js +++ b/lib/function/trigonometry/sin.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/trigonometry/tan.js b/lib/function/trigonometry/tan.js index 8a9e20c7d..f2cf77c12 100644 --- a/lib/function/trigonometry/tan.js +++ b/lib/function/trigonometry/tan.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), collection = require('../../type/collection'), diff --git a/lib/function/utils/ifElse.js b/lib/function/utils/ifElse.js index 8bb7666c7..35ce578e7 100644 --- a/lib/function/utils/ifElse.js +++ b/lib/function/utils/ifElse.js @@ -1,7 +1,7 @@ module.exports = function (math) { var util = require('../../util/index'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Matrix = require('../../type/Matrix'), Complex = require('../../type/Complex'), Unit = require('../../type/Unit'), diff --git a/lib/function/utils/typeof.js b/lib/function/utils/typeof.js index 51d990be8..fe1fc7a09 100644 --- a/lib/function/utils/typeof.js +++ b/lib/function/utils/typeof.js @@ -1,7 +1,7 @@ module.exports = function (math) { var types = require('../../util/types'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../type/BigNumber'), Complex = require('../../type/Complex'), Matrix = require('../../type/Matrix'), Unit = require('../../type/Unit'), diff --git a/lib/math.js b/lib/math.js index 941ed3737..ef9286a60 100644 --- a/lib/math.js +++ b/lib/math.js @@ -33,7 +33,10 @@ function mathjs (settings) { matrix: 'matrix', // type of default number output. Choose 'number' (default) or 'bignumber' - number: 'number' + number: 'number', + + // number of significant digits in bignumbers + decimals: 20 }; /** @@ -49,7 +52,7 @@ function mathjs (settings) { * @return {Object} settings The currently applied settings */ math.config = function config (settings) { - var BigNumber = require('bignumber.js'); + var BigNumber = require('./type/BigNumber'); if (settings) { // merge settings @@ -57,7 +60,7 @@ function mathjs (settings) { if (settings.decimals) { BigNumber.config({ - DECIMAL_PLACES: settings.decimals + precision: settings.decimals // TODO: rename decimals to precision }); } @@ -87,9 +90,7 @@ function mathjs (settings) { } // return a clone of the settings - var current = object.clone(_settings); - current.decimals = BigNumber.config().DECIMAL_PLACES; - return current; + return object.clone(_settings); }; // apply provided configuration settings @@ -107,7 +108,7 @@ function mathjs (settings) { // types (Matrix, Complex, Unit, ...) math.type = {}; - math.type.BigNumber = require('bignumber.js'); + math.type.BigNumber = require('./type/BigNumber').constructor(); // create a new Decimal factory for this instance of math.js math.type.Complex = require('./type/Complex'); math.type.Range = require('./type/Range'); math.type.Index = require('./type/Index'); diff --git a/lib/type/BigNumber.js b/lib/type/BigNumber.js new file mode 100644 index 000000000..b66d4c71a --- /dev/null +++ b/lib/type/BigNumber.js @@ -0,0 +1 @@ +module.exports = require('decimal.js'); diff --git a/lib/util/number.js b/lib/util/number.js index df2ed3dd7..a90e0ac33 100644 --- a/lib/util/number.js +++ b/lib/util/number.js @@ -1,4 +1,4 @@ -var BigNumber = require('bignumber.js'); +var BigNumber = require('../type/BigNumber'); /** * Test whether value is a Number @@ -166,16 +166,14 @@ exports.format = function format(value, options) { throw new Error('options.scientific is deprecated, use options.exponential instead.'); } - // adjust BigNumber configuration + // create a clone of the bignumber with the desired configuration var isBigNumber = value instanceof BigNumber; if (isBigNumber) { - var oldScientific = BigNumber.config().EXPONENTIAL_AT; - BigNumber.config({ - EXPONENTIAL_AT: [ - Math.round(Math.log(lower) / Math.LN10), - Math.round(Math.log(upper) / Math.LN10) - ] + var BN = BigNumber.config({ + toExpNeg: Math.round(Math.log(lower) / Math.LN10), + toExpPos: Math.round(Math.log(upper) / Math.LN10) }); + value = new BN(value); } // handle special case zero @@ -203,10 +201,12 @@ exports.format = function format(value, options) { str = exports.toExponential(value, precision); } + /* TODO: cleanup // restore BigNumber configuration if (isBigNumber) { BigNumber.config({EXPONENTIAL_AT: oldScientific}); } + */ // remove trailing zeros after the decimal point return str.replace(/((\.\d*?)(0+))($|e)/, function () { diff --git a/lib/util/string.js b/lib/util/string.js index 5160da4c4..ca5a6eec0 100644 --- a/lib/util/string.js +++ b/lib/util/string.js @@ -1,5 +1,5 @@ var number = require('./number'), - BigNumber = require('bignumber.js'); + BigNumber = require('../type/BigNumber'); /** * Test whether value is a String diff --git a/package.json b/package.json index d34f2d3a6..00b80d34c 100644 --- a/package.json +++ b/package.json @@ -39,7 +39,7 @@ "unit" ], "dependencies": { - "bignumber.js": "^1.3.0" + "decimal.js": "^1.0.0" }, "devDependencies": { "webpack": "latest", diff --git a/test/expression/node/ConstantNode.test.js b/test/expression/node/ConstantNode.test.js index f5cb492e0..03c6775f8 100644 --- a/test/expression/node/ConstantNode.test.js +++ b/test/expression/node/ConstantNode.test.js @@ -4,7 +4,7 @@ var assert = require('assert'), math = require('../../../index')(), bigmath = require('../../../index')({number: 'bignumber'}), Complex = require('../../../lib/type/Complex'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../../lib/type/BigNumber'), Node = require('../../../lib/expression/node/Node'), ConstantNode = require('../../../lib/expression/node/ConstantNode'), SymbolNode = require('../../../lib/expression/node/SymbolNode'); diff --git a/test/function/arithmetic/ceil.test.js b/test/function/arithmetic/ceil.test.js index 85005d00f..a62eef0ee 100644 --- a/test/function/arithmetic/ceil.test.js +++ b/test/function/arithmetic/ceil.test.js @@ -30,16 +30,16 @@ describe('ceil', function() { }); it('should return the ceil of a big number', function () { - approx.deepEqual(ceil(bignumber(0)), bignumber(0)); - approx.deepEqual(ceil(bignumber(1)), bignumber(1)); - approx.deepEqual(ceil(bignumber(1.3)), bignumber(2)); - approx.deepEqual(ceil(bignumber(1.8)), bignumber(2)); - approx.deepEqual(ceil(bignumber(2)), bignumber(2)); - approx.deepEqual(ceil(bignumber(-1)), bignumber(-1)); - approx.deepEqual(ceil(bignumber(-1.3)), bignumber(-1)); - approx.deepEqual(ceil(bignumber(-1.8)), bignumber(-1)); - approx.deepEqual(ceil(bignumber(-2)), bignumber(-2)); - approx.deepEqual(ceil(bignumber(-2.1)), bignumber(-2)); + assert.deepEqual(ceil(bignumber(0)), bignumber(0)); + assert.deepEqual(ceil(bignumber(1)), bignumber(1)); + assert.deepEqual(ceil(bignumber(1.3)), bignumber(2)); + assert.deepEqual(ceil(bignumber(1.8)), bignumber(2)); + assert.deepEqual(ceil(bignumber(2)), bignumber(2)); + assert.deepEqual(ceil(bignumber(-1)), bignumber(-1)); + assert.deepEqual(ceil(bignumber(-1.3)), bignumber(-1)); + assert.deepEqual(ceil(bignumber(-1.8)), bignumber(-1)); + assert.deepEqual(ceil(bignumber(-2)), bignumber(-2)); + assert.deepEqual(ceil(bignumber(-2.1)), bignumber(-2)); }); it('should return the ceil of real and imag part of a complex', function() { diff --git a/test/function/arithmetic/fix.test.js b/test/function/arithmetic/fix.test.js index ebbd6a437..d4b083c52 100644 --- a/test/function/arithmetic/fix.test.js +++ b/test/function/arithmetic/fix.test.js @@ -30,16 +30,16 @@ describe('fix', function() { }); it('should round big numbers correctly', function() { - approx.deepEqual(fix(bignumber(0)), bignumber(0)); - approx.deepEqual(fix(bignumber(1)), bignumber(1)); - approx.deepEqual(fix(bignumber(1.3)), bignumber(1)); - approx.deepEqual(fix(bignumber(1.8)), bignumber(1)); - approx.deepEqual(fix(bignumber(2)), bignumber(2)); - approx.deepEqual(fix(bignumber(-1)), bignumber(-1)); - approx.deepEqual(fix(bignumber(-1.3)), bignumber(-1)); - approx.deepEqual(fix(bignumber(-1.8)), bignumber(-1)); - approx.deepEqual(fix(bignumber(-2)), bignumber(-2)); - approx.deepEqual(fix(bignumber(-2.1)), bignumber(-2)); + assert.deepEqual(fix(bignumber(0)), bignumber(0)); + assert.deepEqual(fix(bignumber(1)), bignumber(1)); + assert.deepEqual(fix(bignumber(1.3)), bignumber(1)); + assert.deepEqual(fix(bignumber(1.8)), bignumber(1)); + assert.deepEqual(fix(bignumber(2)), bignumber(2)); + assert.deepEqual(fix(bignumber(-1)), bignumber(-1)); + assert.deepEqual(fix(bignumber(-1.3)), bignumber(-1)); + assert.deepEqual(fix(bignumber(-1.8)), bignumber(-1)); + assert.deepEqual(fix(bignumber(-2)), bignumber(-2)); + assert.deepEqual(fix(bignumber(-2.1)), bignumber(-2)); }); it('should round complex numbers correctly', function() { diff --git a/test/function/arithmetic/floor.test.js b/test/function/arithmetic/floor.test.js index ac4339328..5bbab81d9 100644 --- a/test/function/arithmetic/floor.test.js +++ b/test/function/arithmetic/floor.test.js @@ -30,16 +30,16 @@ describe('floor', function() { }); it('should floor big numbers correctly', function() { - approx.deepEqual(floor(bignumber(0)), bignumber(0)); - approx.deepEqual(floor(bignumber(1)), bignumber(1)); - approx.deepEqual(floor(bignumber(1.3)), bignumber(1)); - approx.deepEqual(floor(bignumber(1.8)), bignumber(1)); - approx.deepEqual(floor(bignumber(2)), bignumber(2)); - approx.deepEqual(floor(bignumber(-1)), bignumber(-1)); - approx.deepEqual(floor(bignumber(-1.3)), bignumber(-2)); - approx.deepEqual(floor(bignumber(-1.8)), bignumber(-2)); - approx.deepEqual(floor(bignumber(-2)), bignumber(-2)); - approx.deepEqual(floor(bignumber(-2.1)), bignumber(-3)); + assert.deepEqual(floor(bignumber(0)), bignumber(0)); + assert.deepEqual(floor(bignumber(1)), bignumber(1)); + assert.deepEqual(floor(bignumber(1.3)), bignumber(1)); + assert.deepEqual(floor(bignumber(1.8)), bignumber(1)); + assert.deepEqual(floor(bignumber(2)), bignumber(2)); + assert.deepEqual(floor(bignumber(-1)), bignumber(-1)); + assert.deepEqual(floor(bignumber(-1.3)), bignumber(-2)); + assert.deepEqual(floor(bignumber(-1.8)), bignumber(-2)); + assert.deepEqual(floor(bignumber(-2)), bignumber(-2)); + assert.deepEqual(floor(bignumber(-2.1)), bignumber(-3)); }); it('should floor complex numbers correctly', function() { diff --git a/test/function/construction/bignumber.test.js b/test/function/construction/bignumber.test.js index eeb405daa..4c5999e50 100644 --- a/test/function/construction/bignumber.test.js +++ b/test/function/construction/bignumber.test.js @@ -1,5 +1,5 @@ var assert = require('assert'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../../lib/type/BigNumber'), mathjs = require('../../../index'), math = mathjs(), bignumber = math.bignumber; diff --git a/test/function/utils/format.test.js b/test/function/utils/format.test.js index 374187e81..4bdd559c2 100644 --- a/test/function/utils/format.test.js +++ b/test/function/utils/format.test.js @@ -1,6 +1,7 @@ // test format var assert = require('assert'), - math = require('../../../index')(); + mathjs = require('../../../index'); + math = mathjs(); describe('format', function() { @@ -60,9 +61,7 @@ describe('format', function() { }); describe('bignumber', function () { - before (function () { - math.type.BigNumber.config(20); // ensure the precision is 20 digits, the default - }); + var math = mathjs({decimals: 20}); // ensure the precision is 20 digits, the default it('should format big numbers', function() { assert.equal(math.format(math.bignumber(2).dividedBy(7)), '0.28571428571428571429'); diff --git a/test/util/number.test.js b/test/util/number.test.js index baba3ac2a..0c15aba63 100644 --- a/test/util/number.test.js +++ b/test/util/number.test.js @@ -1,7 +1,7 @@ // test number utils var assert = require('assert'), approx = require('../../tools/approx'), - BigNumber = require('bignumber.js'), + BigNumber = require('../../lib/type/BigNumber'), number = require('../../lib/util/number'); describe('number', function() { @@ -75,18 +75,15 @@ describe('number', function() { }); it('should format a bignumber using toFixed', function() { - var DECIMAL_PLACES = BigNumber.config().DECIMAL_PLACES; - BigNumber.config(100); + var Big = BigNumber.constructor(); + Big.config({decimals: 100}); - assert.equal(number.toFixed(new BigNumber(2.34)), '2'); - assert.equal(number.toFixed(new BigNumber(2.34), 1), '2.3'); - assert.equal(number.toFixed(new BigNumber(2), 20), '2.00000000000000000000'); - assert.equal(number.toFixed(new BigNumber(2), 21), '2.000000000000000000000'); - assert.equal(number.toFixed(new BigNumber(2), 22), '2.0000000000000000000000'); - assert.equal(number.toFixed(new BigNumber(2), 30), '2.000000000000000000000000000000'); - - // restore global bignumber configuration - BigNumber.config(DECIMAL_PLACES); + assert.equal(number.toFixed(new Big(2.34)), '2'); + assert.equal(number.toFixed(new Big(2.34), 1), '2.3'); + assert.equal(number.toFixed(new Big(2), 20), '2.00000000000000000000'); + assert.equal(number.toFixed(new Big(2), 21), '2.000000000000000000000'); + assert.equal(number.toFixed(new Big(2), 22), '2.0000000000000000000000'); + assert.equal(number.toFixed(new Big(2), 30), '2.000000000000000000000000000000'); }); it('should format a number using toExponential', function() { @@ -101,22 +98,19 @@ describe('number', function() { }); it('should format a bignumber using toExponential', function() { - var DECIMAL_PLACES = BigNumber.config().DECIMAL_PLACES; - BigNumber.config(100); + var Big = BigNumber.constructor(); + Big.config({decimals: 100}); - assert.equal(number.toExponential(new BigNumber(2.34)), '2.34e+0'); - assert.equal(number.toExponential(new BigNumber(2.34e+3)), '2.34e+3'); - assert.equal(number.toExponential(new BigNumber(2.34e-3)), '2.34e-3'); - assert.equal(number.toExponential(new BigNumber(2.34e+3), 2), '2.3e+3'); - assert.equal(number.toExponential(new BigNumber(2e+3), 20), '2.0000000000000000000e+3'); - assert.equal(number.toExponential(new BigNumber(2e+3), 21), '2.00000000000000000000e+3'); - assert.equal(number.toExponential(new BigNumber(2e+3), 22), '2.000000000000000000000e+3'); - assert.equal(number.toExponential(new BigNumber(2e+3), 30), '2.00000000000000000000000000000e+3'); - assert.equal(number.toExponential(new BigNumber('2e+300'), 30), '2.00000000000000000000000000000e+300'); - assert.equal(number.toExponential(new BigNumber('2e-300'), 30), '2.00000000000000000000000000000e-300'); - - // restore global bignumber configuration - BigNumber.config(DECIMAL_PLACES); + assert.equal(number.toExponential(new Big(2.34)), '2.34e+0'); + assert.equal(number.toExponential(new Big(2.34e+3)), '2.34e+3'); + assert.equal(number.toExponential(new Big(2.34e-3)), '2.34e-3'); + assert.equal(number.toExponential(new Big(2.34e+3), 2), '2.3e+3'); + assert.equal(number.toExponential(new Big(2e+3), 20), '2.0000000000000000000e+3'); + assert.equal(number.toExponential(new Big(2e+3), 21), '2.00000000000000000000e+3'); + assert.equal(number.toExponential(new Big(2e+3), 22), '2.000000000000000000000e+3'); + assert.equal(number.toExponential(new Big(2e+3), 30), '2.00000000000000000000000000000e+3'); + assert.equal(number.toExponential(new Big('2e+300'), 30), '2.00000000000000000000000000000e+300'); + assert.equal(number.toExponential(new Big('2e-300'), 30), '2.00000000000000000000000000000e-300'); }); it('should convert a number into a bignumber (when possible)', function() { @@ -334,39 +328,42 @@ describe('number', function() { }); describe('bignumber', function () { + var B = null; + before (function () { - BigNumber.config(20); // ensure the precision is 20 digits, the default + B = BigNumber.constructor(); + B.config({precision: 20}); // ensure the precision is 20 digits, the default }); it('should format big numbers', function() { - assert.deepEqual(number.format(new BigNumber('2.3')), '2.3'); - assert.deepEqual(number.format(new BigNumber('0.00000003')), '3e-8'); - assert.deepEqual(number.format(new BigNumber('12345678')), '1.2345678e+7'); + assert.deepEqual(number.format(new B('2.3')), '2.3'); + assert.deepEqual(number.format(new B('0.00000003')), '3e-8'); + assert.deepEqual(number.format(new B('12345678')), '1.2345678e+7'); }); it('should format big numbers with given precision', function() { - assert.deepEqual(number.format(new BigNumber('1.23456'), 3), '1.23'); - assert.deepEqual(number.format(new BigNumber('12345678'), 4), '1.235e+7'); + assert.deepEqual(number.format(new B('1.23456'), 3), '1.23'); + assert.deepEqual(number.format(new B('12345678'), 4), '1.235e+7'); }); it('should format big numbers in exponential notation', function() { var options = { notation: 'exponential' }; - assert.deepEqual(number.format(new BigNumber('1.23456'), options), '1.23456e+0'); - assert.deepEqual(number.format(new BigNumber('12345678'), options), '1.2345678e+7'); - assert.deepEqual(number.format(new BigNumber('2.3e+30'), options), '2.3e+30'); - assert.deepEqual(number.format(new BigNumber('0.23e+30'), options), '2.3e+29'); - assert.deepEqual(number.format(new BigNumber('2.3e-30'), options), '2.3e-30'); - assert.deepEqual(number.format(new BigNumber('0.23e-30'), options), '2.3e-31'); + assert.deepEqual(number.format(new B('1.23456'), options), '1.23456e+0'); + assert.deepEqual(number.format(new B('12345678'), options), '1.2345678e+7'); + assert.deepEqual(number.format(new B('2.3e+30'), options), '2.3e+30'); + assert.deepEqual(number.format(new B('0.23e+30'), options), '2.3e+29'); + assert.deepEqual(number.format(new B('2.3e-30'), options), '2.3e-30'); + assert.deepEqual(number.format(new B('0.23e-30'), options), '2.3e-31'); options.precision = 18; - assert.deepEqual(number.format(new BigNumber(1).div(3), options), '3.33333333333333333e-1'); + assert.deepEqual(number.format(new B(1).div(3), options), '3.33333333333333333e-1'); }); - it.skip('sould format big numbers with custom precision, lower, and upper bound', function() { - var oldPrecision = BigNumber.config().DECIMAL_PLACES; - BigNumber.config({DECIMAL_PLACES: 100}); + it('should format big numbers with custom precision, lower, and upper bound', function() { + var Big = BigNumber.constructor(); + Big.config({precision: 100}); var options = { notation: 'auto', @@ -377,16 +374,13 @@ describe('number', function() { } }; - assert.deepEqual(number.format(new BigNumber(5).div(3), options), '1.6666666666666666666666666666666666666666666666667'); - assert.deepEqual(number.format(new BigNumber(5e+40).div(3), options), '16666666666666666666666666666666666666666.666666667'); - assert.deepEqual(number.format(new BigNumber(5e-40).div(3), options), + assert.deepEqual(number.format(new Big(5).div(3), options), '1.6666666666666666666666666666666666666666666666667'); + assert.deepEqual(number.format(new Big(5e+40).div(3), options), '16666666666666666666666666666666666666666.666666667'); + assert.deepEqual(number.format(new Big(5e-40).div(3), options), '0.00000000000000000000000000000000000000016666666666666666666666666666666666666666666666667'); - assert.deepEqual(number.format(new BigNumber(5e+60).div(3), options), '1.6666666666666666666666666666666666666666666666667e+60'); - assert.deepEqual(number.format(new BigNumber(5e-60).div(3), options), '1.6666666666666666666666666666666666666666666666667e-60'); - assert.deepEqual(number.format(new BigNumber(5e-80).div(3), options), '1.6666666666666666666666666666666666666666666666667e-80'); - - // restore old precision - BigNumber.config({DECIMAL_PLACES: oldPrecision}); + assert.deepEqual(number.format(new Big(5e+60).div(3), options), '1.6666666666666666666666666666666666666666666666667e+60'); + assert.deepEqual(number.format(new Big(5e-60).div(3), options), '1.6666666666666666666666666666666666666666666666667e-60'); + assert.deepEqual(number.format(new Big(5e-80).div(3), options), '1.6666666666666666666666666666666666666666666666667e-80'); }); it('should format big numbers in fixed notation', function() {