mathjs 9.4.5 → 10.0.0
Sign up to get free protection for your applications and to get access to all the features.
- 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
|
},
|