Switched to module decimal.js for BigNumber support, instead of bignumber.js.

This commit is contained in:
josdejong 2014-04-04 21:08:33 +02:00
parent 721f21574e
commit d19e7ea570
88 changed files with 219 additions and 234 deletions

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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:

View File

@ -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`.

View File

@ -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)

View File

@ -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();

View File

@ -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;

View File

@ -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,

View File

@ -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'),

View File

@ -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'),

View File

@ -1,6 +1,6 @@
var Node = require('./Node'),
BigNumber = require('bignumber.js'),
BigNumber = require('../../type/BigNumber'),
Complex = require('../../type/Complex'),
Unit = require('../../type/Unit'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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,

View File

@ -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'),

View File

@ -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'),

View File

@ -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,

View File

@ -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'),

View File

@ -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'),

View File

@ -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,

View File

@ -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'),

View File

@ -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'),

View File

@ -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)) {

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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,

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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,

View File

@ -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,

View File

@ -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'),

View File

@ -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;

View File

@ -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,

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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,

View File

@ -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'),

View File

@ -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'),

View File

@ -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);
};
};

View File

@ -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);
};
};

View File

@ -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);
};
};

View File

@ -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,

View File

@ -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,

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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'),

View File

@ -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');

1
lib/type/BigNumber.js Normal file
View File

@ -0,0 +1 @@
module.exports = require('decimal.js');

View File

@ -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 () {

View File

@ -1,5 +1,5 @@
var number = require('./number'),
BigNumber = require('bignumber.js');
BigNumber = require('../type/BigNumber');
/**
* Test whether value is a String

View File

@ -39,7 +39,7 @@
"unit"
],
"dependencies": {
"bignumber.js": "^1.3.0"
"decimal.js": "^1.0.0"
},
"devDependencies": {
"webpack": "latest",

View File

@ -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');

View File

@ -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() {

View File

@ -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() {

View File

@ -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() {

View File

@ -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;

View File

@ -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');

View File

@ -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() {