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.
Files changed (74) hide show
  1. package/HISTORY.md +35 -0
  2. package/bin/cli.js +0 -0
  3. package/docs/expressions/syntax.md +46 -43
  4. package/docs/reference/functions/format.md +5 -2
  5. package/docs/reference/functions/parser.md +4 -4
  6. package/docs/reference/functions/setCartesian.md +3 -1
  7. package/lib/browser/math.js +5 -5
  8. package/lib/browser/math.js.map +1 -1
  9. package/lib/cjs/constants.js +1 -1
  10. package/lib/cjs/core/function/config.js +1 -1
  11. package/lib/cjs/core/function/import.js +2 -1
  12. package/lib/cjs/entry/dependenciesAny/dependenciesParserClass.generated.js +2 -2
  13. package/lib/cjs/entry/dependenciesAny.generated.js +999 -999
  14. package/lib/cjs/entry/dependenciesNumber/dependenciesParserClass.generated.js +2 -2
  15. package/lib/cjs/entry/dependenciesNumber.generated.js +581 -581
  16. package/lib/cjs/entry/impureFunctionsAny.generated.js +314 -313
  17. package/lib/cjs/entry/impureFunctionsNumber.generated.js +223 -222
  18. package/lib/cjs/entry/mainAny.js +8 -8
  19. package/lib/cjs/entry/mainNumber.js +8 -8
  20. package/lib/cjs/entry/pureFunctionsAny.generated.js +1100 -1100
  21. package/lib/cjs/entry/pureFunctionsNumber.generated.js +375 -375
  22. package/lib/cjs/entry/typeChecks.js +12 -12
  23. package/lib/cjs/expression/Parser.js +6 -5
  24. package/lib/cjs/expression/embeddedDocs/function/set/setCartesian.js +1 -1
  25. package/lib/cjs/expression/function/parser.js +4 -4
  26. package/lib/cjs/expression/node/OperatorNode.js +9 -6
  27. package/lib/cjs/expression/operators.js +1 -1
  28. package/lib/cjs/expression/parse.js +42 -6
  29. package/lib/cjs/factoriesAny.js +660 -660
  30. package/lib/cjs/factoriesNumber.js +268 -237
  31. package/lib/cjs/function/set/setCartesian.js +3 -1
  32. package/lib/cjs/function/string/format.js +5 -2
  33. package/lib/cjs/header.js +2 -2
  34. package/lib/cjs/plain/bignumber/arithmetic.js +2 -2
  35. package/lib/cjs/plain/number/arithmetic.js +10 -10
  36. package/lib/cjs/plain/number/constants.js +1 -1
  37. package/lib/cjs/plain/number/logical.js +1 -1
  38. package/lib/cjs/plain/number/probability.js +2 -1
  39. package/lib/cjs/plain/number/trigonometry.js +1 -1
  40. package/lib/cjs/plain/number/utils.js +1 -1
  41. package/lib/cjs/type/unit/physicalConstants.js +1 -1
  42. package/lib/cjs/utils/array.js +14 -14
  43. package/lib/cjs/utils/bignumber/bitwise.js +1 -1
  44. package/lib/cjs/utils/customs.js +5 -5
  45. package/lib/cjs/utils/factory.js +3 -3
  46. package/lib/cjs/utils/function.js +1 -1
  47. package/lib/cjs/utils/is.js +23 -23
  48. package/lib/cjs/utils/latex.js +2 -1
  49. package/lib/cjs/utils/map.js +3 -3
  50. package/lib/cjs/utils/noop.js +1 -1
  51. package/lib/cjs/utils/number.js +10 -6
  52. package/lib/cjs/utils/object.js +8 -8
  53. package/lib/cjs/utils/snapshot.js +1 -1
  54. package/lib/cjs/utils/string.js +2 -2
  55. package/lib/cjs/version.js +1 -1
  56. package/lib/esm/core/function/import.js +2 -1
  57. package/lib/esm/entry/dependenciesAny/dependenciesParserClass.generated.js +2 -2
  58. package/lib/esm/entry/dependenciesAny.generated.js +270 -270
  59. package/lib/esm/entry/dependenciesNumber/dependenciesParserClass.generated.js +2 -2
  60. package/lib/esm/entry/dependenciesNumber.generated.js +163 -163
  61. package/lib/esm/entry/impureFunctionsAny.generated.js +301 -301
  62. package/lib/esm/entry/impureFunctionsNumber.generated.js +211 -211
  63. package/lib/esm/entry/pureFunctionsAny.generated.js +816 -816
  64. package/lib/esm/entry/pureFunctionsNumber.generated.js +234 -234
  65. package/lib/esm/expression/Parser.js +6 -5
  66. package/lib/esm/expression/embeddedDocs/function/set/setCartesian.js +1 -1
  67. package/lib/esm/expression/function/parser.js +4 -4
  68. package/lib/esm/expression/node/OperatorNode.js +9 -6
  69. package/lib/esm/expression/parse.js +42 -6
  70. package/lib/esm/function/set/setCartesian.js +3 -1
  71. package/lib/esm/function/string/format.js +5 -2
  72. package/lib/esm/version.js +1 -1
  73. package/package.json +16 -16
  74. 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 = ['parse'];
4
+ var dependencies = ['evaluate'];
5
5
  export var createParserClass = /* #__PURE__ */factory(name, dependencies, _ref => {
6
6
  var {
7
- parse
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('function f(x, y) = x^y') // f(x, y)
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, for example "2+3"
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 parse(expr).compile().evaluate(this.scope);
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') // 3.5
29
- * parser.evaluate('x + 3') // 6.5
30
- * parser.evaluate('function f(x, y) = x^y') // f(x, y)
31
- * parser.evaluate('f(2, 3)') // 8
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
- params = [node, parseMultiplyDivide(state)];
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 = parseUnary(state);
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 = parseUnary(state);
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 before the operation.
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
- * A number between 0 and 16 to round the digits of the number. In case
56
- * of notations 'exponential', 'engineering', and 'auto', `precision`
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.
@@ -1,2 +1,2 @@
1
- export var version = '9.4.5'; // Note: This file is automatically generated when building math.js.
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": "9.4.5",
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.15.4",
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.15.5",
40
- "@babel/plugin-transform-object-assign": "7.14.5",
41
- "@babel/plugin-transform-runtime": "7.15.0",
42
- "@babel/preset-env": "7.15.6",
43
- "@babel/register": "7.15.3",
44
- "babel-loader": "8.2.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.17.3",
47
+ "core-js": "3.19.1",
48
48
  "del": "6.0.0",
49
- "dtslint": "4.1.6",
49
+ "dtslint": "4.2.0",
50
50
  "expr-eval": "2.0.2",
51
51
  "fancy-log": "1.3.3",
52
- "glob": "7.1.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.3",
58
- "karma": "6.3.4",
57
+ "jsep": "1.2.0",
58
+ "karma": "6.3.7",
59
59
  "karma-browserstack-launcher": "1.6.0",
60
- "karma-firefox-launcher": "2.1.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.3",
75
+ "standard": "16.0.4",
76
76
  "sylvester": "0.0.21",
77
- "typescript": "4.4.3",
77
+ "typescript": "4.4.4",
78
78
  "webpack": "4.46.0",
79
79
  "zeros": "1.0.0"
80
80
  },