mathjs 9.4.5 → 10.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/HISTORY.md +35 -0
- package/bin/cli.js +0 -0
- package/docs/expressions/syntax.md +46 -43
- package/docs/reference/functions/format.md +5 -2
- package/docs/reference/functions/parser.md +4 -4
- package/docs/reference/functions/setCartesian.md +3 -1
- package/lib/browser/math.js +5 -5
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/constants.js +1 -1
- package/lib/cjs/core/function/config.js +1 -1
- package/lib/cjs/core/function/import.js +2 -1
- package/lib/cjs/entry/dependenciesAny/dependenciesParserClass.generated.js +2 -2
- package/lib/cjs/entry/dependenciesAny.generated.js +999 -999
- package/lib/cjs/entry/dependenciesNumber/dependenciesParserClass.generated.js +2 -2
- package/lib/cjs/entry/dependenciesNumber.generated.js +581 -581
- package/lib/cjs/entry/impureFunctionsAny.generated.js +314 -313
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +223 -222
- package/lib/cjs/entry/mainAny.js +8 -8
- package/lib/cjs/entry/mainNumber.js +8 -8
- package/lib/cjs/entry/pureFunctionsAny.generated.js +1100 -1100
- package/lib/cjs/entry/pureFunctionsNumber.generated.js +375 -375
- package/lib/cjs/entry/typeChecks.js +12 -12
- package/lib/cjs/expression/Parser.js +6 -5
- package/lib/cjs/expression/embeddedDocs/function/set/setCartesian.js +1 -1
- package/lib/cjs/expression/function/parser.js +4 -4
- package/lib/cjs/expression/node/OperatorNode.js +9 -6
- package/lib/cjs/expression/operators.js +1 -1
- package/lib/cjs/expression/parse.js +42 -6
- package/lib/cjs/factoriesAny.js +660 -660
- package/lib/cjs/factoriesNumber.js +268 -237
- package/lib/cjs/function/set/setCartesian.js +3 -1
- package/lib/cjs/function/string/format.js +5 -2
- package/lib/cjs/header.js +2 -2
- package/lib/cjs/plain/bignumber/arithmetic.js +2 -2
- package/lib/cjs/plain/number/arithmetic.js +10 -10
- package/lib/cjs/plain/number/constants.js +1 -1
- package/lib/cjs/plain/number/logical.js +1 -1
- package/lib/cjs/plain/number/probability.js +2 -1
- package/lib/cjs/plain/number/trigonometry.js +1 -1
- package/lib/cjs/plain/number/utils.js +1 -1
- package/lib/cjs/type/unit/physicalConstants.js +1 -1
- package/lib/cjs/utils/array.js +14 -14
- package/lib/cjs/utils/bignumber/bitwise.js +1 -1
- package/lib/cjs/utils/customs.js +5 -5
- package/lib/cjs/utils/factory.js +3 -3
- package/lib/cjs/utils/function.js +1 -1
- package/lib/cjs/utils/is.js +23 -23
- package/lib/cjs/utils/latex.js +2 -1
- package/lib/cjs/utils/map.js +3 -3
- package/lib/cjs/utils/noop.js +1 -1
- package/lib/cjs/utils/number.js +10 -6
- package/lib/cjs/utils/object.js +8 -8
- package/lib/cjs/utils/snapshot.js +1 -1
- package/lib/cjs/utils/string.js +2 -2
- package/lib/cjs/version.js +1 -1
- package/lib/esm/core/function/import.js +2 -1
- package/lib/esm/entry/dependenciesAny/dependenciesParserClass.generated.js +2 -2
- package/lib/esm/entry/dependenciesAny.generated.js +270 -270
- package/lib/esm/entry/dependenciesNumber/dependenciesParserClass.generated.js +2 -2
- package/lib/esm/entry/dependenciesNumber.generated.js +163 -163
- package/lib/esm/entry/impureFunctionsAny.generated.js +301 -301
- package/lib/esm/entry/impureFunctionsNumber.generated.js +211 -211
- package/lib/esm/entry/pureFunctionsAny.generated.js +816 -816
- package/lib/esm/entry/pureFunctionsNumber.generated.js +234 -234
- package/lib/esm/expression/Parser.js +6 -5
- package/lib/esm/expression/embeddedDocs/function/set/setCartesian.js +1 -1
- package/lib/esm/expression/function/parser.js +4 -4
- package/lib/esm/expression/node/OperatorNode.js +9 -6
- package/lib/esm/expression/parse.js +42 -6
- package/lib/esm/function/set/setCartesian.js +3 -1
- package/lib/esm/function/string/format.js +5 -2
- package/lib/esm/version.js +1 -1
- package/package.json +16 -16
- package/types/index.d.ts +281 -77
@@ -1,10 +1,10 @@
|
|
1
1
|
import { factory } from '../utils/factory.js';
|
2
2
|
import { createEmptyMap, toObject } from '../utils/map.js';
|
3
3
|
var name = 'Parser';
|
4
|
-
var dependencies = ['
|
4
|
+
var dependencies = ['evaluate'];
|
5
5
|
export var createParserClass = /* #__PURE__ */factory(name, dependencies, _ref => {
|
6
6
|
var {
|
7
|
-
|
7
|
+
evaluate
|
8
8
|
} = _ref;
|
9
9
|
|
10
10
|
/**
|
@@ -37,7 +37,7 @@ export var createParserClass = /* #__PURE__ */factory(name, dependencies, _ref =
|
|
37
37
|
* // define variables and functions
|
38
38
|
* parser.evaluate('x = 7 / 2') // 3.5
|
39
39
|
* parser.evaluate('x + 3') // 6.5
|
40
|
-
* parser.evaluate('
|
40
|
+
* parser.evaluate('f(x, y) = x^y') // f(x, y)
|
41
41
|
* parser.evaluate('f(2, 3)') // 8
|
42
42
|
*
|
43
43
|
* // get and set variables and functions
|
@@ -74,14 +74,15 @@ export var createParserClass = /* #__PURE__ */factory(name, dependencies, _ref =
|
|
74
74
|
Parser.prototype.isParser = true;
|
75
75
|
/**
|
76
76
|
* Parse and evaluate the given expression
|
77
|
-
* @param {string} expr A string containing an expression,
|
77
|
+
* @param {string | string[]} expr A string containing an expression,
|
78
|
+
* for example "2+3", or a list with expressions
|
78
79
|
* @return {*} result The result, or undefined when the expression was empty
|
79
80
|
* @throws {Error}
|
80
81
|
*/
|
81
82
|
|
82
83
|
Parser.prototype.evaluate = function (expr) {
|
83
84
|
// TODO: validate arguments
|
84
|
-
return
|
85
|
+
return evaluate(expr, this.scope);
|
85
86
|
};
|
86
87
|
/**
|
87
88
|
* Get a variable (a function or variable) by name from the parsers scope.
|
@@ -2,7 +2,7 @@ export var setCartesianDocs = {
|
|
2
2
|
name: 'setCartesian',
|
3
3
|
category: 'Set',
|
4
4
|
syntax: ['setCartesian(set1, set2)'],
|
5
|
-
description: 'Create the cartesian product of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays before the operation.',
|
5
|
+
description: 'Create the cartesian product of two (multi)sets. Multi-dimension arrays will be converted to single-dimension arrays and the values will be sorted in ascending order before the operation.',
|
6
6
|
examples: ['setCartesian([1, 2], [3, 4])'],
|
7
7
|
seealso: ['setUnion', 'setIntersect', 'setDifference', 'setPowerset']
|
8
8
|
};
|
@@ -25,10 +25,10 @@ export var createParser = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
25
25
|
* const d = parser.evaluate('cos(45 deg)') // 0.7071067811865476
|
26
26
|
*
|
27
27
|
* // define variables and functions
|
28
|
-
* parser.evaluate('x = 7 / 2')
|
29
|
-
* parser.evaluate('x + 3')
|
30
|
-
* parser.evaluate('
|
31
|
-
* parser.evaluate('f(2, 3)')
|
28
|
+
* parser.evaluate('x = 7 / 2') // 3.5
|
29
|
+
* parser.evaluate('x + 3') // 6.5
|
30
|
+
* parser.evaluate('f(x, y) = x^y') // f(x, y)
|
31
|
+
* parser.evaluate('f(2, 3)') // 8
|
32
32
|
*
|
33
33
|
* // get and set variables and functions
|
34
34
|
* const x = parser.get('x') // 7
|
@@ -21,8 +21,9 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
21
21
|
* @param {string} fn Function name, for example 'add'
|
22
22
|
* @param {Node[]} args Operator arguments
|
23
23
|
* @param {boolean} [implicit] Is this an implicit multiplication?
|
24
|
+
* @param {boolean} [isPercentage] Is this an percentage Operation?
|
24
25
|
*/
|
25
|
-
function OperatorNode(op, fn, args, implicit) {
|
26
|
+
function OperatorNode(op, fn, args, implicit, isPercentage) {
|
26
27
|
if (!(this instanceof OperatorNode)) {
|
27
28
|
throw new SyntaxError('Constructor must be called with the new operator');
|
28
29
|
} // validate input
|
@@ -41,6 +42,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
41
42
|
}
|
42
43
|
|
43
44
|
this.implicit = implicit === true;
|
45
|
+
this.isPercentage = isPercentage === true;
|
44
46
|
this.op = op;
|
45
47
|
this.fn = fn;
|
46
48
|
this.args = args || [];
|
@@ -123,7 +125,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
123
125
|
args[i] = this._ifNode(callback(this.args[i], 'args[' + i + ']', this));
|
124
126
|
}
|
125
127
|
|
126
|
-
return new OperatorNode(this.op, this.fn, args, this.implicit);
|
128
|
+
return new OperatorNode(this.op, this.fn, args, this.implicit, this.isPercentage);
|
127
129
|
};
|
128
130
|
/**
|
129
131
|
* Create a clone of this node, a shallow copy
|
@@ -132,7 +134,7 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
132
134
|
|
133
135
|
|
134
136
|
OperatorNode.prototype.clone = function () {
|
135
|
-
return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit);
|
137
|
+
return new OperatorNode(this.op, this.fn, this.args.slice(0), this.implicit, this.isPercentage);
|
136
138
|
};
|
137
139
|
/**
|
138
140
|
* Check whether this is an unary OperatorNode:
|
@@ -466,20 +468,21 @@ export var createOperatorNode = /* #__PURE__ */factory(name, dependencies, _ref
|
|
466
468
|
op: this.op,
|
467
469
|
fn: this.fn,
|
468
470
|
args: this.args,
|
469
|
-
implicit: this.implicit
|
471
|
+
implicit: this.implicit,
|
472
|
+
isPercentage: this.isPercentage
|
470
473
|
};
|
471
474
|
};
|
472
475
|
/**
|
473
476
|
* Instantiate an OperatorNode from its JSON representation
|
474
477
|
* @param {Object} json An object structured like
|
475
|
-
* `{"mathjs": "OperatorNode", "op": "+", "fn": "add", "args": [...], "implicit": false}`,
|
478
|
+
* `{"mathjs": "OperatorNode", "op": "+", "fn": "add", "args": [...], "implicit": false, "isPercentage":false}`,
|
476
479
|
* where mathjs is optional
|
477
480
|
* @returns {OperatorNode}
|
478
481
|
*/
|
479
482
|
|
480
483
|
|
481
484
|
OperatorNode.fromJSON = function (json) {
|
482
|
-
return new OperatorNode(json.op, json.fn, json.args, json.implicit);
|
485
|
+
return new OperatorNode(json.op, json.fn, json.args, json.implicit, json.isPercentage);
|
483
486
|
};
|
484
487
|
/**
|
485
488
|
* Get HTML representation.
|
@@ -1006,7 +1006,14 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
1006
1006
|
name = state.token;
|
1007
1007
|
fn = operators[name];
|
1008
1008
|
getTokenSkipNewline(state);
|
1009
|
-
|
1009
|
+
var rightNode = parseMultiplyDivide(state);
|
1010
|
+
|
1011
|
+
if (rightNode.isPercentage) {
|
1012
|
+
params = [node, new OperatorNode('*', 'multiply', [node, rightNode])];
|
1013
|
+
} else {
|
1014
|
+
params = [node, rightNode];
|
1015
|
+
}
|
1016
|
+
|
1010
1017
|
node = new OperatorNode(name, fn, params);
|
1011
1018
|
}
|
1012
1019
|
|
@@ -1027,9 +1034,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
1027
1034
|
'*': 'multiply',
|
1028
1035
|
'.*': 'dotMultiply',
|
1029
1036
|
'/': 'divide',
|
1030
|
-
'./': 'dotDivide'
|
1031
|
-
'%': 'mod',
|
1032
|
-
mod: 'mod'
|
1037
|
+
'./': 'dotDivide'
|
1033
1038
|
};
|
1034
1039
|
|
1035
1040
|
while (true) {
|
@@ -1087,7 +1092,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
1087
1092
|
|
1088
1093
|
|
1089
1094
|
function parseRule2(state) {
|
1090
|
-
var node =
|
1095
|
+
var node = parsePercentage(state);
|
1091
1096
|
var last = node;
|
1092
1097
|
var tokenStates = [];
|
1093
1098
|
|
@@ -1109,7 +1114,7 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
1109
1114
|
_extends(state, tokenStates.pop());
|
1110
1115
|
|
1111
1116
|
tokenStates.pop();
|
1112
|
-
last =
|
1117
|
+
last = parsePercentage(state);
|
1113
1118
|
node = new OperatorNode('/', 'divide', [node, last]);
|
1114
1119
|
} else {
|
1115
1120
|
// Not a match, so rewind
|
@@ -1132,6 +1137,37 @@ export var createParse = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
1132
1137
|
|
1133
1138
|
return node;
|
1134
1139
|
}
|
1140
|
+
/**
|
1141
|
+
* percentage or mod
|
1142
|
+
* @return {Node} node
|
1143
|
+
* @private
|
1144
|
+
*/
|
1145
|
+
|
1146
|
+
|
1147
|
+
function parsePercentage(state) {
|
1148
|
+
var node, name, fn, params;
|
1149
|
+
node = parseUnary(state);
|
1150
|
+
var operators = {
|
1151
|
+
'%': 'mod',
|
1152
|
+
mod: 'mod'
|
1153
|
+
};
|
1154
|
+
|
1155
|
+
while (hasOwnProperty(operators, state.token)) {
|
1156
|
+
name = state.token;
|
1157
|
+
fn = operators[name];
|
1158
|
+
getTokenSkipNewline(state);
|
1159
|
+
|
1160
|
+
if (name === '%' && state.tokenType === TOKENTYPE.DELIMITER && state.token !== '(') {
|
1161
|
+
// If the expression contains only %, then treat that as /100
|
1162
|
+
node = new OperatorNode('/', 'divide', [node, new ConstantNode(100)], false, true);
|
1163
|
+
} else {
|
1164
|
+
params = [node, parseUnary(state)];
|
1165
|
+
node = new OperatorNode(name, fn, params);
|
1166
|
+
}
|
1167
|
+
}
|
1168
|
+
|
1169
|
+
return node;
|
1170
|
+
}
|
1135
1171
|
/**
|
1136
1172
|
* Unary plus and minus, and logical and bitwise not
|
1137
1173
|
* @return {Node} node
|
@@ -14,7 +14,8 @@ export var createSetCartesian = /* #__PURE__ */factory(name, dependencies, _ref
|
|
14
14
|
|
15
15
|
/**
|
16
16
|
* Create the cartesian product of two (multi)sets.
|
17
|
-
* Multi-dimension arrays will be converted to single-dimension arrays
|
17
|
+
* Multi-dimension arrays will be converted to single-dimension arrays
|
18
|
+
* and the values will be sorted in ascending order before the operation.
|
18
19
|
*
|
19
20
|
* Syntax:
|
20
21
|
*
|
@@ -23,6 +24,7 @@ export var createSetCartesian = /* #__PURE__ */factory(name, dependencies, _ref
|
|
23
24
|
* Examples:
|
24
25
|
*
|
25
26
|
* math.setCartesian([1, 2], [3, 4]) // returns [[1, 3], [1, 4], [2, 3], [2, 4]]
|
27
|
+
* math.setCartesian([4, 3], [2, 1]) // returns [[3, 1], [3, 2], [4, 1], [4, 2]]
|
26
28
|
*
|
27
29
|
* See also:
|
28
30
|
*
|
@@ -52,8 +52,11 @@ export var createFormat = /* #__PURE__ */factory(name, dependencies, _ref => {
|
|
52
52
|
* For example format(-1, {notation: 'hex', wordSize: 8}) === '0xffi8'.
|
53
53
|
* Default value is undefined.
|
54
54
|
* - `precision: number`
|
55
|
-
*
|
56
|
-
*
|
55
|
+
* Limit the number of digits of the formatted value.
|
56
|
+
* For regular numbers, must be a number between 0 and 16.
|
57
|
+
* For bignumbers, the maximum depends on the configured precision,
|
58
|
+
* see function `config()`.
|
59
|
+
* In case of notations 'exponential', 'engineering', and 'auto', `precision`
|
57
60
|
* defines the total number of significant digits returned.
|
58
61
|
* In case of notation 'fixed', `precision` defines the number of
|
59
62
|
* significant digits after the decimal point.
|
package/lib/esm/version.js
CHANGED
@@ -1,2 +1,2 @@
|
|
1
|
-
export var version = '
|
1
|
+
export var version = '10.0.0'; // Note: This file is automatically generated when building math.js.
|
2
2
|
// Changes made in this file will be overwritten.
|
package/package.json
CHANGED
@@ -1,6 +1,6 @@
|
|
1
1
|
{
|
2
2
|
"name": "mathjs",
|
3
|
-
"version": "
|
3
|
+
"version": "10.0.0",
|
4
4
|
"description": "Math.js is an extensive math library for JavaScript and Node.js. It features a flexible expression parser with support for symbolic computation, comes with a large set of built-in functions and constants, and offers an integrated solution to work with different data types like numbers, big numbers, complex numbers, fractions, units, and matrices.",
|
5
5
|
"author": "Jos de Jong <wjosdejong@gmail.com> (https://github.com/josdejong)",
|
6
6
|
"homepage": "https://mathjs.org",
|
@@ -25,7 +25,7 @@
|
|
25
25
|
"unit"
|
26
26
|
],
|
27
27
|
"dependencies": {
|
28
|
-
"@babel/runtime": "^7.
|
28
|
+
"@babel/runtime": "^7.16.0",
|
29
29
|
"complex.js": "^2.0.15",
|
30
30
|
"decimal.js": "^10.3.1",
|
31
31
|
"escape-latex": "^1.2.0",
|
@@ -36,28 +36,28 @@
|
|
36
36
|
"typed-function": "^2.0.0"
|
37
37
|
},
|
38
38
|
"devDependencies": {
|
39
|
-
"@babel/core": "7.
|
40
|
-
"@babel/plugin-transform-object-assign": "7.
|
41
|
-
"@babel/plugin-transform-runtime": "7.
|
42
|
-
"@babel/preset-env": "7.
|
43
|
-
"@babel/register": "7.
|
44
|
-
"babel-loader": "8.2.
|
39
|
+
"@babel/core": "7.16.0",
|
40
|
+
"@babel/plugin-transform-object-assign": "7.16.0",
|
41
|
+
"@babel/plugin-transform-runtime": "7.16.0",
|
42
|
+
"@babel/preset-env": "7.16.0",
|
43
|
+
"@babel/register": "7.16.0",
|
44
|
+
"babel-loader": "8.2.3",
|
45
45
|
"benchmark": "2.1.4",
|
46
46
|
"codecov": "3.8.3",
|
47
|
-
"core-js": "3.
|
47
|
+
"core-js": "3.19.1",
|
48
48
|
"del": "6.0.0",
|
49
|
-
"dtslint": "4.
|
49
|
+
"dtslint": "4.2.0",
|
50
50
|
"expr-eval": "2.0.2",
|
51
51
|
"fancy-log": "1.3.3",
|
52
|
-
"glob": "7.
|
52
|
+
"glob": "7.2.0",
|
53
53
|
"gulp": "4.0.2",
|
54
54
|
"gulp-babel": "8.0.0",
|
55
55
|
"handlebars": "4.7.7",
|
56
56
|
"istanbul": "0.4.5",
|
57
|
-
"jsep": "1.0
|
58
|
-
"karma": "6.3.
|
57
|
+
"jsep": "1.2.0",
|
58
|
+
"karma": "6.3.7",
|
59
59
|
"karma-browserstack-launcher": "1.6.0",
|
60
|
-
"karma-firefox-launcher": "2.1.
|
60
|
+
"karma-firefox-launcher": "2.1.2",
|
61
61
|
"karma-mocha": "2.0.1",
|
62
62
|
"karma-mocha-reporter": "2.2.5",
|
63
63
|
"karma-webpack": "4.0.2",
|
@@ -72,9 +72,9 @@
|
|
72
72
|
"numericjs": "1.2.6",
|
73
73
|
"nyc": "15.1.0",
|
74
74
|
"pad-right": "0.2.2",
|
75
|
-
"standard": "16.0.
|
75
|
+
"standard": "16.0.4",
|
76
76
|
"sylvester": "0.0.21",
|
77
|
-
"typescript": "4.4.
|
77
|
+
"typescript": "4.4.4",
|
78
78
|
"webpack": "4.46.0",
|
79
79
|
"zeros": "1.0.0"
|
80
80
|
},
|