mathjs/docs/datatypes/bignumbers.md
2013-11-27 13:07:05 +01:00

2.7 KiB

Big Numbers

For calculations with an arbitrary precision, math.js supports BigNumber. BigNumber is powered by the the library bignumber.js.

A big number can be created using the function bignumber:

math.bignumber('2.3e+500'); // BigNumber, 2.3e+500

Math.js can be configured to use big numbers instead of numbers by default:

var mathjs = require('mathjs'),
    math = mathjs({
      number: {
        defaultType: 'bignumber' // Choose from: 'number' (default), 'bignumber'
      }
    });

// use math
math.eval('0.1 + 0.2'); // BigNumber, 0.3

*Important: BigNumber is not supported by the following functions: exp, gcd, lcm, log, log10, xgcd, arg, random, acos, asin, atan, atan2, cos, cot, csc, sec, sin, tan, range. These functions will downgrade BigNumber to Number, and return a Number. *

Calculations with BigNumber are much slower than calculations with Number, but they can be executed with an arbitrary precision. By using a higher precision, it is less likely that round-off errors occur:

// round-off errors with numbers
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 :)
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, which can be changed by configuring BigNumber:

BigNumber.config({DECIMAL_PLACES: 32});

Big numbers can be converted to numbers and vice versa using the functions number and bignumber. When converting a big number to a number, the high precision of the will be lost.When a BigNumber is too large to be represented as Number, it will be initialized as Infinity.

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

// exceeding the maximum of a number
var d = math.bignumber('1.2e500');                // BigNumber, 1.2e+500
var e = math.number(d);                           // Number, Infinity

// loosing precision when converting to number
var f = math.bignumber('0.2222222222222222222');  // BigNumber, 0.2222222222222222222
var g = math.number(f);                           // Number,    0.2222222222222222