mathjs 15.0.0 → 15.1.1
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 +34 -6
- package/NOTICE +1 -1
- package/README.md +7 -7
- package/bin/cli.js +1 -1
- package/lib/browser/math.js +1 -1
- package/lib/browser/math.js.LICENSE.txt +3 -3
- package/lib/browser/math.js.map +1 -1
- package/lib/cjs/core/function/import.js +7 -0
- package/lib/cjs/core/function/typed.js +1 -1
- package/lib/cjs/entry/dependenciesAny/dependenciesBernoulli.generated.js +25 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesConstantNode.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesEqual.generated.js +0 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesIsBounded.generated.js +17 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesIsFinite.generated.js +21 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesIsInteger.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesSimplifyConstant.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny/dependenciesUnitClass.generated.js +0 -2
- package/lib/cjs/entry/dependenciesAny/dependenciesZeta.generated.js +2 -0
- package/lib/cjs/entry/dependenciesAny.generated.js +21 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesBernoulli.generated.js +21 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesConstantNode.generated.js +2 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesIsBounded.generated.js +17 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesIsFinite.generated.js +21 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesSimplifyConstant.generated.js +2 -0
- package/lib/cjs/entry/dependenciesNumber/dependenciesZeta.generated.js +2 -0
- package/lib/cjs/entry/dependenciesNumber.generated.js +21 -0
- package/lib/cjs/entry/impureFunctionsAny.generated.js +217 -212
- package/lib/cjs/entry/impureFunctionsNumber.generated.js +82 -77
- package/lib/cjs/entry/pureFunctionsAny.generated.js +668 -652
- package/lib/cjs/entry/pureFunctionsNumber.generated.js +155 -140
- package/lib/cjs/expression/embeddedDocs/embeddedDocs.js +6 -0
- package/lib/cjs/expression/embeddedDocs/function/combinatorics/stirlingS2.js +2 -2
- package/lib/cjs/expression/embeddedDocs/function/probability/bernoulli.js +14 -0
- package/lib/cjs/expression/embeddedDocs/function/utils/isBounded.js +14 -0
- package/lib/cjs/expression/embeddedDocs/function/utils/isFinite.js +14 -0
- package/lib/cjs/expression/embeddedDocs/function/utils/isNaN.js +1 -1
- package/lib/cjs/expression/embeddedDocs/function/utils/isNumeric.js +1 -1
- package/lib/cjs/expression/node/AccessorNode.js +36 -7
- package/lib/cjs/expression/node/ConstantNode.js +4 -4
- package/lib/cjs/expression/node/FunctionNode.js +20 -5
- package/lib/cjs/expression/parse.js +62 -14
- package/lib/cjs/factoriesAny.js +21 -0
- package/lib/cjs/factoriesNumber.js +23 -2
- package/lib/cjs/function/algebra/polynomialRoot.js +4 -0
- package/lib/cjs/function/algebra/simplifyConstant.js +3 -2
- package/lib/cjs/function/arithmetic/add.js +8 -1
- package/lib/cjs/function/arithmetic/cbrt.js +7 -6
- package/lib/cjs/function/arithmetic/ceil.js +10 -2
- package/lib/cjs/function/arithmetic/exp.js +7 -5
- package/lib/cjs/function/arithmetic/expm1.js +6 -5
- package/lib/cjs/function/arithmetic/fix.js +10 -2
- package/lib/cjs/function/arithmetic/floor.js +10 -2
- package/lib/cjs/function/arithmetic/log.js +13 -0
- package/lib/cjs/function/arithmetic/mod.js +8 -2
- package/lib/cjs/function/arithmetic/nthRoot.js +9 -3
- package/lib/cjs/function/arithmetic/nthRoots.js +12 -11
- package/lib/cjs/function/matrix/map.js +6 -0
- package/lib/cjs/function/probability/bernoulli.js +108 -0
- package/lib/cjs/function/relational/compare.js +6 -0
- package/lib/cjs/function/relational/compareNatural.js +8 -2
- package/lib/cjs/function/relational/deepEqual.js +8 -3
- package/lib/cjs/function/relational/equal.js +17 -5
- package/lib/cjs/function/relational/unequal.js +14 -2
- package/lib/cjs/function/set/setDistinct.js +2 -1
- package/lib/cjs/function/special/zeta.js +3 -2
- package/lib/cjs/function/string/format.js +9 -0
- package/lib/cjs/function/utils/isBounded.js +54 -0
- package/lib/cjs/function/utils/isFinite.js +57 -0
- package/lib/cjs/function/utils/isInteger.js +7 -15
- package/lib/cjs/function/utils/isNaN.js +1 -1
- package/lib/cjs/function/utils/isNumeric.js +1 -1
- package/lib/cjs/function/utils/numeric.js +6 -0
- package/lib/cjs/header.js +3 -3
- package/lib/cjs/json/replacer.js +1 -1
- package/lib/cjs/plain/number/probability.js +2 -2
- package/lib/cjs/plain/number/trigonometry.js +1 -1
- package/lib/cjs/type/bigint.js +5 -0
- package/lib/cjs/type/boolean.js +6 -0
- package/lib/cjs/type/complex/function/complex.js +6 -0
- package/lib/cjs/type/fraction/function/fraction.js +9 -1
- package/lib/cjs/type/matrix/SparseMatrix.js +24 -4
- package/lib/cjs/type/matrix/function/index.js +8 -0
- package/lib/cjs/type/matrix/function/matrix.js +6 -0
- package/lib/cjs/type/matrix/function/sparse.js +4 -0
- package/lib/cjs/type/string.js +4 -0
- package/lib/cjs/type/unit/Unit.js +12 -8
- package/lib/cjs/type/unit/function/unit.js +8 -0
- package/lib/cjs/utils/number.js +7 -7
- package/lib/cjs/utils/optimizeCallback.js +13 -1
- package/lib/cjs/version.js +1 -1
- package/lib/esm/core/function/import.js +7 -0
- package/lib/esm/core/function/typed.js +1 -1
- package/lib/esm/entry/dependenciesAny/dependenciesBernoulli.generated.js +18 -0
- package/lib/esm/entry/dependenciesAny/dependenciesConstantNode.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesEqual.generated.js +0 -2
- package/lib/esm/entry/dependenciesAny/dependenciesIsBounded.generated.js +10 -0
- package/lib/esm/entry/dependenciesAny/dependenciesIsFinite.generated.js +14 -0
- package/lib/esm/entry/dependenciesAny/dependenciesIsInteger.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesSimplifyConstant.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny/dependenciesUnitClass.generated.js +0 -2
- package/lib/esm/entry/dependenciesAny/dependenciesZeta.generated.js +2 -0
- package/lib/esm/entry/dependenciesAny.generated.js +3 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesBernoulli.generated.js +14 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesConstantNode.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesIsBounded.generated.js +10 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesIsFinite.generated.js +14 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesSimplifyConstant.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber/dependenciesZeta.generated.js +2 -0
- package/lib/esm/entry/dependenciesNumber.generated.js +3 -0
- package/lib/esm/entry/impureFunctionsAny.generated.js +219 -214
- package/lib/esm/entry/impureFunctionsNumber.generated.js +84 -79
- package/lib/esm/entry/pureFunctionsAny.generated.js +665 -649
- package/lib/esm/entry/pureFunctionsNumber.generated.js +154 -139
- package/lib/esm/expression/embeddedDocs/embeddedDocs.js +6 -0
- package/lib/esm/expression/embeddedDocs/function/combinatorics/stirlingS2.js +2 -2
- package/lib/esm/expression/embeddedDocs/function/probability/bernoulli.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/utils/isBounded.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/utils/isFinite.js +8 -0
- package/lib/esm/expression/embeddedDocs/function/utils/isNaN.js +1 -1
- package/lib/esm/expression/embeddedDocs/function/utils/isNumeric.js +1 -1
- package/lib/esm/expression/node/AccessorNode.js +36 -7
- package/lib/esm/expression/node/ConstantNode.js +4 -4
- package/lib/esm/expression/node/FunctionNode.js +20 -5
- package/lib/esm/expression/parse.js +62 -14
- package/lib/esm/factoriesAny.js +3 -0
- package/lib/esm/factoriesNumber.js +3 -0
- package/lib/esm/function/algebra/polynomialRoot.js +4 -0
- package/lib/esm/function/algebra/simplifyConstant.js +3 -2
- package/lib/esm/function/arithmetic/add.js +8 -1
- package/lib/esm/function/arithmetic/cbrt.js +7 -6
- package/lib/esm/function/arithmetic/ceil.js +10 -2
- package/lib/esm/function/arithmetic/exp.js +7 -5
- package/lib/esm/function/arithmetic/expm1.js +6 -5
- package/lib/esm/function/arithmetic/fix.js +10 -2
- package/lib/esm/function/arithmetic/floor.js +10 -2
- package/lib/esm/function/arithmetic/log.js +13 -0
- package/lib/esm/function/arithmetic/mod.js +8 -2
- package/lib/esm/function/arithmetic/nthRoot.js +9 -3
- package/lib/esm/function/arithmetic/nthRoots.js +12 -11
- package/lib/esm/function/matrix/map.js +6 -0
- package/lib/esm/function/probability/bernoulli.js +102 -0
- package/lib/esm/function/relational/compare.js +6 -0
- package/lib/esm/function/relational/compareNatural.js +8 -2
- package/lib/esm/function/relational/deepEqual.js +8 -3
- package/lib/esm/function/relational/equal.js +17 -5
- package/lib/esm/function/relational/unequal.js +14 -2
- package/lib/esm/function/set/setDistinct.js +2 -1
- package/lib/esm/function/special/zeta.js +3 -2
- package/lib/esm/function/string/format.js +9 -0
- package/lib/esm/function/utils/isBounded.js +48 -0
- package/lib/esm/function/utils/isFinite.js +51 -0
- package/lib/esm/function/utils/isInteger.js +7 -15
- package/lib/esm/function/utils/isNaN.js +1 -1
- package/lib/esm/function/utils/isNumeric.js +1 -1
- package/lib/esm/function/utils/numeric.js +6 -0
- package/lib/esm/header.js +1 -1
- package/lib/esm/json/replacer.js +1 -1
- package/lib/esm/plain/number/probability.js +2 -2
- package/lib/esm/plain/number/trigonometry.js +1 -1
- package/lib/esm/type/bigint.js +5 -0
- package/lib/esm/type/boolean.js +6 -0
- package/lib/esm/type/complex/function/complex.js +6 -0
- package/lib/esm/type/fraction/function/fraction.js +9 -1
- package/lib/esm/type/matrix/SparseMatrix.js +24 -4
- package/lib/esm/type/matrix/function/index.js +8 -0
- package/lib/esm/type/matrix/function/matrix.js +6 -0
- package/lib/esm/type/matrix/function/sparse.js +4 -0
- package/lib/esm/type/string.js +4 -0
- package/lib/esm/type/unit/Unit.js +12 -8
- package/lib/esm/type/unit/function/unit.js +8 -0
- package/lib/esm/utils/number.js +7 -7
- package/lib/esm/utils/optimizeCallback.js +13 -1
- package/lib/esm/version.js +1 -1
- package/package.json +15 -15
- package/types/index.d.ts +580 -237
|
@@ -38,8 +38,13 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
|
|
|
38
38
|
* @param {Node} object The object from which to retrieve
|
|
39
39
|
* a property or subset.
|
|
40
40
|
* @param {IndexNode} index IndexNode containing ranges
|
|
41
|
+
* @param {boolean} [optionalChaining=false]
|
|
42
|
+
* Optional property, if the accessor was written as optional-chaining
|
|
43
|
+
* using `a?.b`, or `a?.["b"] with bracket notation.
|
|
44
|
+
* Forces evaluate to undefined if the given object is undefined or null.
|
|
41
45
|
*/
|
|
42
46
|
constructor(object, index) {
|
|
47
|
+
let optionalChaining = arguments.length > 2 && arguments[2] !== undefined ? arguments[2] : false;
|
|
43
48
|
super();
|
|
44
49
|
if (!(0, _is.isNode)(object)) {
|
|
45
50
|
throw new TypeError('Node expected for parameter "object"');
|
|
@@ -49,6 +54,7 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
|
|
|
49
54
|
}
|
|
50
55
|
this.object = object;
|
|
51
56
|
this.index = index;
|
|
57
|
+
this.optionalChaining = optionalChaining;
|
|
52
58
|
}
|
|
53
59
|
|
|
54
60
|
// readonly property name
|
|
@@ -82,15 +88,36 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
|
|
|
82
88
|
_compile(math, argNames) {
|
|
83
89
|
const evalObject = this.object._compile(math, argNames);
|
|
84
90
|
const evalIndex = this.index._compile(math, argNames);
|
|
91
|
+
const optionalChaining = this.optionalChaining;
|
|
92
|
+
const prevOptionalChaining = (0, _is.isAccessorNode)(this.object) && this.object.optionalChaining;
|
|
85
93
|
if (this.index.isObjectProperty()) {
|
|
86
94
|
const prop = this.index.getObjectProperty();
|
|
87
95
|
return function evalAccessorNode(scope, args, context) {
|
|
96
|
+
const ctx = context || {};
|
|
97
|
+
const object = evalObject(scope, args, ctx);
|
|
98
|
+
if (optionalChaining && object == null) {
|
|
99
|
+
ctx.optionalShortCircuit = true;
|
|
100
|
+
return undefined;
|
|
101
|
+
}
|
|
102
|
+
if (prevOptionalChaining && ctx !== null && ctx !== void 0 && ctx.optionalShortCircuit) {
|
|
103
|
+
return undefined;
|
|
104
|
+
}
|
|
105
|
+
|
|
88
106
|
// get a property from an object evaluated using the scope.
|
|
89
|
-
return (0, _customs.getSafeProperty)(
|
|
107
|
+
return (0, _customs.getSafeProperty)(object, prop);
|
|
90
108
|
};
|
|
91
109
|
} else {
|
|
92
110
|
return function evalAccessorNode(scope, args, context) {
|
|
93
|
-
const
|
|
111
|
+
const ctx = context || {};
|
|
112
|
+
const object = evalObject(scope, args, ctx);
|
|
113
|
+
if (optionalChaining && object == null) {
|
|
114
|
+
ctx.optionalShortCircuit = true;
|
|
115
|
+
return undefined;
|
|
116
|
+
}
|
|
117
|
+
if (prevOptionalChaining && ctx !== null && ctx !== void 0 && ctx.optionalShortCircuit) {
|
|
118
|
+
return undefined;
|
|
119
|
+
}
|
|
120
|
+
|
|
94
121
|
// we pass just object here instead of context:
|
|
95
122
|
const index = evalIndex(scope, args, object);
|
|
96
123
|
return access(object, index);
|
|
@@ -114,7 +141,7 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
|
|
|
114
141
|
* @returns {AccessorNode} Returns a transformed copy of the node
|
|
115
142
|
*/
|
|
116
143
|
map(callback) {
|
|
117
|
-
return new AccessorNode(this._ifNode(callback(this.object, 'object', this)), this._ifNode(callback(this.index, 'index', this)));
|
|
144
|
+
return new AccessorNode(this._ifNode(callback(this.object, 'object', this)), this._ifNode(callback(this.index, 'index', this)), this.optionalChaining);
|
|
118
145
|
}
|
|
119
146
|
|
|
120
147
|
/**
|
|
@@ -122,7 +149,7 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
|
|
|
122
149
|
* @return {AccessorNode}
|
|
123
150
|
*/
|
|
124
151
|
clone() {
|
|
125
|
-
return new AccessorNode(this.object, this.index);
|
|
152
|
+
return new AccessorNode(this.object, this.index, this.optionalChaining);
|
|
126
153
|
}
|
|
127
154
|
|
|
128
155
|
/**
|
|
@@ -135,7 +162,8 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
|
|
|
135
162
|
if (needParenthesis(this.object)) {
|
|
136
163
|
object = '(' + object + ')';
|
|
137
164
|
}
|
|
138
|
-
|
|
165
|
+
const optionalChaining = this.optionalChaining ? this.index.dotNotation ? '?' : '?.' : '';
|
|
166
|
+
return object + optionalChaining + this.index.toString(options);
|
|
139
167
|
}
|
|
140
168
|
|
|
141
169
|
/**
|
|
@@ -172,7 +200,8 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
|
|
|
172
200
|
return {
|
|
173
201
|
mathjs: name,
|
|
174
202
|
object: this.object,
|
|
175
|
-
index: this.index
|
|
203
|
+
index: this.index,
|
|
204
|
+
optionalChaining: this.optionalChaining
|
|
176
205
|
};
|
|
177
206
|
}
|
|
178
207
|
|
|
@@ -185,7 +214,7 @@ const createAccessorNode = exports.createAccessorNode = /* #__PURE__ */(0, _fact
|
|
|
185
214
|
* @returns {AccessorNode}
|
|
186
215
|
*/
|
|
187
216
|
static fromJSON(json) {
|
|
188
|
-
return new AccessorNode(json.object, json.index);
|
|
217
|
+
return new AccessorNode(json.object, json.index, json.optionalChaining);
|
|
189
218
|
}
|
|
190
219
|
}
|
|
191
220
|
(0, _defineProperty2.default)(AccessorNode, "name", name);
|
|
@@ -11,10 +11,11 @@ var _is = require("../../utils/is.js");
|
|
|
11
11
|
var _latex = require("../../utils/latex.js");
|
|
12
12
|
var _factory = require("../../utils/factory.js");
|
|
13
13
|
const name = 'ConstantNode';
|
|
14
|
-
const dependencies = ['Node'];
|
|
14
|
+
const dependencies = ['Node', 'isBounded'];
|
|
15
15
|
const createConstantNode = exports.createConstantNode = /* #__PURE__ */(0, _factory.factory)(name, dependencies, _ref => {
|
|
16
16
|
let {
|
|
17
|
-
Node
|
|
17
|
+
Node,
|
|
18
|
+
isBounded
|
|
18
19
|
} = _ref;
|
|
19
20
|
class ConstantNode extends Node {
|
|
20
21
|
/**
|
|
@@ -157,8 +158,7 @@ const createConstantNode = exports.createConstantNode = /* #__PURE__ */(0, _fact
|
|
|
157
158
|
case 'number':
|
|
158
159
|
case 'BigNumber':
|
|
159
160
|
{
|
|
160
|
-
|
|
161
|
-
if (!finite) {
|
|
161
|
+
if (!isBounded(this.value)) {
|
|
162
162
|
return this.value.valueOf() < 0 ? '-\\infty' : '\\infty';
|
|
163
163
|
}
|
|
164
164
|
const index = value.toLowerCase().indexOf('e');
|
|
@@ -107,7 +107,7 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
|
|
|
107
107
|
* the arguments, typically a SymbolNode or AccessorNode
|
|
108
108
|
* @param {./Node[]} args
|
|
109
109
|
*/
|
|
110
|
-
constructor(fn, args) {
|
|
110
|
+
constructor(fn, args, optional) {
|
|
111
111
|
super();
|
|
112
112
|
if (typeof fn === 'string') {
|
|
113
113
|
fn = new SymbolNode(fn);
|
|
@@ -118,8 +118,13 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
|
|
|
118
118
|
if (!Array.isArray(args) || !args.every(_is.isNode)) {
|
|
119
119
|
throw new TypeError('Array containing Nodes expected for parameter "args"');
|
|
120
120
|
}
|
|
121
|
+
const optionalType = typeof optional;
|
|
122
|
+
if (!(optionalType === 'undefined' || optionalType === 'boolean')) {
|
|
123
|
+
throw new TypeError('optional flag, if specified, must be boolean');
|
|
124
|
+
}
|
|
121
125
|
this.fn = fn;
|
|
122
126
|
this.args = args || [];
|
|
127
|
+
this.optional = !!optional;
|
|
123
128
|
}
|
|
124
129
|
|
|
125
130
|
// readonly property name
|
|
@@ -149,6 +154,7 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
|
|
|
149
154
|
_compile(math, argNames) {
|
|
150
155
|
// compile arguments
|
|
151
156
|
const evalArgs = this.args.map(arg => arg._compile(math, argNames));
|
|
157
|
+
const fromOptionalChaining = this.optional || (0, _is.isAccessorNode)(this.fn) && this.fn.optionalChaining;
|
|
152
158
|
if ((0, _is.isSymbolNode)(this.fn)) {
|
|
153
159
|
const name = this.fn.name;
|
|
154
160
|
if (!argNames[name]) {
|
|
@@ -162,10 +168,8 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
|
|
|
162
168
|
value = scope.get(name);
|
|
163
169
|
} else if (name in math) {
|
|
164
170
|
value = (0, _customs.getSafeProperty)(math, name);
|
|
165
|
-
} else
|
|
166
|
-
|
|
167
|
-
}
|
|
168
|
-
if (typeof value === 'function') {
|
|
171
|
+
} else if (fromOptionalChaining) value = undefined;else return FunctionNode.onUndefinedFunction(name);
|
|
172
|
+
if (typeof value === 'function' || fromOptionalChaining && value === undefined) {
|
|
169
173
|
return value;
|
|
170
174
|
}
|
|
171
175
|
throw new TypeError(`'${name}' is not a function; its value is:\n ${strin(value)}`);
|
|
@@ -192,17 +196,20 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
|
|
|
192
196
|
case 0:
|
|
193
197
|
return function evalFunctionNode(scope, args, context) {
|
|
194
198
|
const fn = resolveFn(scope);
|
|
199
|
+
if (fromOptionalChaining && fn === undefined) return undefined;
|
|
195
200
|
return fn();
|
|
196
201
|
};
|
|
197
202
|
case 1:
|
|
198
203
|
return function evalFunctionNode(scope, args, context) {
|
|
199
204
|
const fn = resolveFn(scope);
|
|
205
|
+
if (fromOptionalChaining && fn === undefined) return undefined;
|
|
200
206
|
const evalArg0 = evalArgs[0];
|
|
201
207
|
return fn(evalArg0(scope, args, context));
|
|
202
208
|
};
|
|
203
209
|
case 2:
|
|
204
210
|
return function evalFunctionNode(scope, args, context) {
|
|
205
211
|
const fn = resolveFn(scope);
|
|
212
|
+
if (fromOptionalChaining && fn === undefined) return undefined;
|
|
206
213
|
const evalArg0 = evalArgs[0];
|
|
207
214
|
const evalArg1 = evalArgs[1];
|
|
208
215
|
return fn(evalArg0(scope, args, context), evalArg1(scope, args, context));
|
|
@@ -210,6 +217,7 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
|
|
|
210
217
|
default:
|
|
211
218
|
return function evalFunctionNode(scope, args, context) {
|
|
212
219
|
const fn = resolveFn(scope);
|
|
220
|
+
if (fromOptionalChaining && fn === undefined) return undefined;
|
|
213
221
|
const values = evalArgs.map(evalArg => evalArg(scope, args, context));
|
|
214
222
|
return fn(...values);
|
|
215
223
|
};
|
|
@@ -220,6 +228,7 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
|
|
|
220
228
|
const rawArgs = this.args;
|
|
221
229
|
return function evalFunctionNode(scope, args, context) {
|
|
222
230
|
const fn = (0, _customs.getSafeProperty)(args, name);
|
|
231
|
+
if (fromOptionalChaining && fn === undefined) return undefined;
|
|
223
232
|
if (typeof fn !== 'function') {
|
|
224
233
|
throw new TypeError(`Argument '${name}' was not a function; received: ${strin(fn)}`);
|
|
225
234
|
}
|
|
@@ -241,6 +250,11 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
|
|
|
241
250
|
const rawArgs = this.args;
|
|
242
251
|
return function evalFunctionNode(scope, args, context) {
|
|
243
252
|
const object = evalObject(scope, args, context);
|
|
253
|
+
|
|
254
|
+
// Optional chaining: if the base object is nullish, short-circuit to undefined
|
|
255
|
+
if (fromOptionalChaining && (object == null || object[prop] === undefined)) {
|
|
256
|
+
return undefined;
|
|
257
|
+
}
|
|
244
258
|
const fn = (0, _customs.getSafeMethod)(object, prop);
|
|
245
259
|
if (fn !== null && fn !== void 0 && fn.rawArgs) {
|
|
246
260
|
// "Raw" evaluation
|
|
@@ -260,6 +274,7 @@ const createFunctionNode = exports.createFunctionNode = /* #__PURE__ */(0, _fact
|
|
|
260
274
|
const rawArgs = this.args;
|
|
261
275
|
return function evalFunctionNode(scope, args, context) {
|
|
262
276
|
const fn = evalFn(scope, args, context);
|
|
277
|
+
if (fromOptionalChaining && fn === undefined) return undefined;
|
|
263
278
|
if (typeof fn !== 'function') {
|
|
264
279
|
throw new TypeError(`Expression '${fnExpr}' did not evaluate to a function; value is:` + `\n ${strin(fn)}`);
|
|
265
280
|
}
|
|
@@ -68,6 +68,23 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
|
|
|
68
68
|
*
|
|
69
69
|
* evaluate, compile
|
|
70
70
|
*
|
|
71
|
+
* History:
|
|
72
|
+
*
|
|
73
|
+
* v0.9 Created
|
|
74
|
+
* v0.13 Switched to one-based indices
|
|
75
|
+
* v0.14 Added `[1,2;3,4]` notation for matrices
|
|
76
|
+
* v0.18 Dropped the `function` keyword
|
|
77
|
+
* v0.20 Added ternary conditional
|
|
78
|
+
* v0.27 Allow multi-line expressions; allow functions that receive
|
|
79
|
+
* unevaluated parameters (`rawArgs`)
|
|
80
|
+
* v3 Add object notation; allow assignments internal to other
|
|
81
|
+
* expressions
|
|
82
|
+
* v7.3 Supported binary, octal, and hexadecimal notation
|
|
83
|
+
* v9.5 Support for calculations with percentages
|
|
84
|
+
* v12.4 Allow trailing commas in matrices
|
|
85
|
+
* v14.8 Add nullish coalescing operator
|
|
86
|
+
* v15.1 Add optional chaining operator
|
|
87
|
+
*
|
|
71
88
|
* @param {string | string[] | Matrix} expr Expression to be parsed
|
|
72
89
|
* @param {{nodes: Object<string, Node>}} [options] Available options:
|
|
73
90
|
* - `nodes` a set of custom nodes
|
|
@@ -136,6 +153,7 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
|
|
|
136
153
|
'=': true,
|
|
137
154
|
':': true,
|
|
138
155
|
'?': true,
|
|
156
|
+
'?.': true,
|
|
139
157
|
'??': true,
|
|
140
158
|
'==': true,
|
|
141
159
|
'!=': true,
|
|
@@ -302,7 +320,9 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
|
|
|
302
320
|
}
|
|
303
321
|
|
|
304
322
|
// check for delimiters consisting of 2 characters
|
|
305
|
-
|
|
323
|
+
// Special case: the check for '?.' is to prevent a case like 'a?.3:.7' from being interpreted as optional chaining
|
|
324
|
+
// TODO: refactor the tokenization into some better way to deal with cases like 'a?.3:.7', see https://github.com/josdejong/mathjs/pull/3584
|
|
325
|
+
if (c2.length === 2 && DELIMITERS[c2] && (c2 !== '?.' || !parse.isDigit(state.expression.charAt(state.index + 2)))) {
|
|
306
326
|
state.tokenType = TOKENTYPE.DELIMITER;
|
|
307
327
|
state.token = c2;
|
|
308
328
|
next(state);
|
|
@@ -647,6 +667,9 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
|
|
|
647
667
|
return new AssignmentNode(new SymbolNode(name), value);
|
|
648
668
|
} else if ((0, _is.isAccessorNode)(node)) {
|
|
649
669
|
// parse a matrix subset assignment like 'A[1,2] = 4'
|
|
670
|
+
if (node.optionalChaining) {
|
|
671
|
+
throw createSyntaxError(state, 'Cannot assign to optional chain');
|
|
672
|
+
}
|
|
650
673
|
getTokenSkipNewline(state);
|
|
651
674
|
value = parseAssignment(state);
|
|
652
675
|
return new AssignmentNode(node.object, node.index, value);
|
|
@@ -891,8 +914,15 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
|
|
|
891
914
|
let node;
|
|
892
915
|
const params = [];
|
|
893
916
|
if (state.token === ':') {
|
|
894
|
-
|
|
895
|
-
|
|
917
|
+
if (state.conditionalLevel === state.nestingLevel) {
|
|
918
|
+
// we are in the midst of parsing a conditional operator, so not
|
|
919
|
+
// a range, but rather an empty true-expr, which is considered a
|
|
920
|
+
// syntax error
|
|
921
|
+
throw createSyntaxError(state, 'The true-expression of a conditional operator may not be empty');
|
|
922
|
+
} else {
|
|
923
|
+
// implicit start of range = 1 (one-based)
|
|
924
|
+
node = new ConstantNode(1);
|
|
925
|
+
}
|
|
896
926
|
} else {
|
|
897
927
|
// explicit start
|
|
898
928
|
node = parseAddSubtract(state);
|
|
@@ -1261,9 +1291,9 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
|
|
|
1261
1291
|
|
|
1262
1292
|
/**
|
|
1263
1293
|
* parse accessors:
|
|
1264
|
-
* - function invocation in round brackets (...), for example sqrt(2)
|
|
1265
|
-
* - index enclosed in square brackets [...], for example A[2,3]
|
|
1266
|
-
* - dot notation for properties, like foo.bar
|
|
1294
|
+
* - function invocation in round brackets (...), for example sqrt(2) or sqrt?.(2) with optional chaining
|
|
1295
|
+
* - index enclosed in square brackets [...], for example A[2,3] or A?.[2,3] with optional chaining
|
|
1296
|
+
* - dot notation for properties, like foo.bar or foo?.bar with optional chaining
|
|
1267
1297
|
* @param {Object} state
|
|
1268
1298
|
* @param {Node} node Node on which to apply the parameters. If there
|
|
1269
1299
|
* are no parameters in the expression, the node
|
|
@@ -1275,12 +1305,27 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
|
|
|
1275
1305
|
*/
|
|
1276
1306
|
function parseAccessors(state, node, types) {
|
|
1277
1307
|
let params;
|
|
1278
|
-
|
|
1308
|
+
|
|
1309
|
+
// Iterate and handle chained accessors, including repeated optional chaining
|
|
1310
|
+
while (true) {
|
|
1279
1311
|
// eslint-disable-line no-unmodified-loop-condition
|
|
1312
|
+
// Track whether an optional chaining operator precedes the next accessor
|
|
1313
|
+
let optional = false;
|
|
1314
|
+
|
|
1315
|
+
// Consume an optional chaining operator if present
|
|
1316
|
+
if (state.token === '?.') {
|
|
1317
|
+
optional = true;
|
|
1318
|
+
// consume the '?.' token
|
|
1319
|
+
getToken(state);
|
|
1320
|
+
}
|
|
1321
|
+
const hasNextAccessor = (state.token === '(' || state.token === '[' || state.token === '.') && (!types || types.includes(state.token));
|
|
1322
|
+
if (!(optional || hasNextAccessor)) {
|
|
1323
|
+
break;
|
|
1324
|
+
}
|
|
1280
1325
|
params = [];
|
|
1281
1326
|
if (state.token === '(') {
|
|
1282
|
-
if ((0, _is.isSymbolNode)(node) || (0, _is.isAccessorNode)(node)) {
|
|
1283
|
-
// function invocation
|
|
1327
|
+
if (optional || (0, _is.isSymbolNode)(node) || (0, _is.isAccessorNode)(node)) {
|
|
1328
|
+
// function invocation: fn(2, 3) or obj.fn(2, 3) or (anything)?.(2, 3)
|
|
1284
1329
|
openParams(state);
|
|
1285
1330
|
getToken(state);
|
|
1286
1331
|
if (state.token !== ')') {
|
|
@@ -1298,7 +1343,7 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
|
|
|
1298
1343
|
}
|
|
1299
1344
|
closeParams(state);
|
|
1300
1345
|
getToken(state);
|
|
1301
|
-
node = new FunctionNode(node, params);
|
|
1346
|
+
node = new FunctionNode(node, params, optional);
|
|
1302
1347
|
} else {
|
|
1303
1348
|
// implicit multiplication like (2+3)(4+5) or sqrt(2)(1+2)
|
|
1304
1349
|
// don't parse it here but let it be handled by parseImplicitMultiplication
|
|
@@ -1324,18 +1369,21 @@ const createParse = exports.createParse = /* #__PURE__ */(0, _factory.factory)(n
|
|
|
1324
1369
|
}
|
|
1325
1370
|
closeParams(state);
|
|
1326
1371
|
getToken(state);
|
|
1327
|
-
node = new AccessorNode(node, new IndexNode(params));
|
|
1372
|
+
node = new AccessorNode(node, new IndexNode(params), optional);
|
|
1328
1373
|
} else {
|
|
1329
1374
|
// dot notation like variable.prop
|
|
1330
|
-
|
|
1375
|
+
// consume the `.` (if it was ?., already consumed):
|
|
1376
|
+
if (!optional) getToken(state);
|
|
1331
1377
|
const isPropertyName = state.tokenType === TOKENTYPE.SYMBOL || state.tokenType === TOKENTYPE.DELIMITER && state.token in NAMED_DELIMITERS;
|
|
1332
1378
|
if (!isPropertyName) {
|
|
1333
|
-
|
|
1379
|
+
let message = 'Property name expected after ';
|
|
1380
|
+
message += optional ? 'optional chain' : 'dot';
|
|
1381
|
+
throw createSyntaxError(state, message);
|
|
1334
1382
|
}
|
|
1335
1383
|
params.push(new ConstantNode(state.token));
|
|
1336
1384
|
getToken(state);
|
|
1337
1385
|
const dotNotation = true;
|
|
1338
|
-
node = new AccessorNode(node, new IndexNode(params, dotNotation));
|
|
1386
|
+
node = new AccessorNode(node, new IndexNode(params, dotNotation), optional);
|
|
1339
1387
|
}
|
|
1340
1388
|
}
|
|
1341
1389
|
return node;
|
package/lib/cjs/factoriesAny.js
CHANGED
|
@@ -153,6 +153,12 @@ Object.defineProperty(exports, "createBellNumbers", {
|
|
|
153
153
|
return _bellNumbers.createBellNumbers;
|
|
154
154
|
}
|
|
155
155
|
});
|
|
156
|
+
Object.defineProperty(exports, "createBernoulli", {
|
|
157
|
+
enumerable: true,
|
|
158
|
+
get: function () {
|
|
159
|
+
return _bernoulli.createBernoulli;
|
|
160
|
+
}
|
|
161
|
+
});
|
|
156
162
|
Object.defineProperty(exports, "createBigNumberClass", {
|
|
157
163
|
enumerable: true,
|
|
158
164
|
get: function () {
|
|
@@ -939,6 +945,18 @@ Object.defineProperty(exports, "createInvmod", {
|
|
|
939
945
|
return _invmod.createInvmod;
|
|
940
946
|
}
|
|
941
947
|
});
|
|
948
|
+
Object.defineProperty(exports, "createIsBounded", {
|
|
949
|
+
enumerable: true,
|
|
950
|
+
get: function () {
|
|
951
|
+
return _isBounded.createIsBounded;
|
|
952
|
+
}
|
|
953
|
+
});
|
|
954
|
+
Object.defineProperty(exports, "createIsFinite", {
|
|
955
|
+
enumerable: true,
|
|
956
|
+
get: function () {
|
|
957
|
+
return _isFinite.createIsFinite;
|
|
958
|
+
}
|
|
959
|
+
});
|
|
942
960
|
Object.defineProperty(exports, "createIsInteger", {
|
|
943
961
|
enumerable: true,
|
|
944
962
|
get: function () {
|
|
@@ -2215,6 +2233,8 @@ var _hasNumericValue = require("./function/utils/hasNumericValue.js");
|
|
|
2215
2233
|
var _isPositive = require("./function/utils/isPositive.js");
|
|
2216
2234
|
var _isZero = require("./function/utils/isZero.js");
|
|
2217
2235
|
var _isNaN = require("./function/utils/isNaN.js");
|
|
2236
|
+
var _isBounded = require("./function/utils/isBounded.js");
|
|
2237
|
+
var _isFinite = require("./function/utils/isFinite.js");
|
|
2218
2238
|
var _typeOf = require("./function/utils/typeOf.js");
|
|
2219
2239
|
var _equalScalar = require("./function/relational/equalScalar.js");
|
|
2220
2240
|
var _SparseMatrix = require("./type/matrix/SparseMatrix.js");
|
|
@@ -2443,6 +2463,7 @@ var _variance = require("./function/statistics/variance.js");
|
|
|
2443
2463
|
var _quantileSeq = require("./function/statistics/quantileSeq.js");
|
|
2444
2464
|
var _std = require("./function/statistics/std.js");
|
|
2445
2465
|
var _corr = require("./function/statistics/corr.js");
|
|
2466
|
+
var _bernoulli = require("./function/probability/bernoulli.js");
|
|
2446
2467
|
var _combinations = require("./function/probability/combinations.js");
|
|
2447
2468
|
var _combinationsWithRep = require("./function/probability/combinationsWithRep.js");
|
|
2448
2469
|
var _gamma = require("./function/probability/gamma.js");
|
|
@@ -31,6 +31,12 @@ Object.defineProperty(exports, "createBellNumbers", {
|
|
|
31
31
|
return _bellNumbers.createBellNumbers;
|
|
32
32
|
}
|
|
33
33
|
});
|
|
34
|
+
Object.defineProperty(exports, "createBernoulli", {
|
|
35
|
+
enumerable: true,
|
|
36
|
+
get: function () {
|
|
37
|
+
return _bernoulli.createBernoulli;
|
|
38
|
+
}
|
|
39
|
+
});
|
|
34
40
|
Object.defineProperty(exports, "createBigint", {
|
|
35
41
|
enumerable: true,
|
|
36
42
|
get: function () {
|
|
@@ -303,6 +309,18 @@ Object.defineProperty(exports, "createInfinity", {
|
|
|
303
309
|
return _constants.createInfinity;
|
|
304
310
|
}
|
|
305
311
|
});
|
|
312
|
+
Object.defineProperty(exports, "createIsBounded", {
|
|
313
|
+
enumerable: true,
|
|
314
|
+
get: function () {
|
|
315
|
+
return _isBounded.createIsBounded;
|
|
316
|
+
}
|
|
317
|
+
});
|
|
318
|
+
Object.defineProperty(exports, "createIsFinite", {
|
|
319
|
+
enumerable: true,
|
|
320
|
+
get: function () {
|
|
321
|
+
return _isFinite.createIsFinite;
|
|
322
|
+
}
|
|
323
|
+
});
|
|
306
324
|
exports.createIsNegative = exports.createIsNaN = exports.createIsInteger = void 0;
|
|
307
325
|
Object.defineProperty(exports, "createIsNumeric", {
|
|
308
326
|
enumerable: true,
|
|
@@ -354,8 +372,7 @@ Object.defineProperty(exports, "createLargerEq", {
|
|
|
354
372
|
return _largerEq.createLargerEqNumber;
|
|
355
373
|
}
|
|
356
374
|
});
|
|
357
|
-
exports.createLeftShift = exports.createLcm = void 0;
|
|
358
|
-
exports.createLog2 = exports.createLog1p = exports.createLog10 = exports.createLog = exports.createLgamma = void 0;
|
|
375
|
+
exports.createLog2 = exports.createLog1p = exports.createLog10 = exports.createLog = exports.createLgamma = exports.createLeftShift = exports.createLcm = void 0;
|
|
359
376
|
Object.defineProperty(exports, "createMad", {
|
|
360
377
|
enumerable: true,
|
|
361
378
|
get: function () {
|
|
@@ -853,6 +870,7 @@ var _map = require("./function/matrix/map.js");
|
|
|
853
870
|
var _range = require("./function/matrix/range.js");
|
|
854
871
|
var _size = require("./function/matrix/size.js");
|
|
855
872
|
var _partitionSelect = require("./function/matrix/partitionSelect.js");
|
|
873
|
+
var _bernoulli = require("./function/probability/bernoulli.js");
|
|
856
874
|
var _combinationsWithRep = require("./function/probability/combinationsWithRep.js");
|
|
857
875
|
var _factorial = require("./function/probability/factorial.js");
|
|
858
876
|
var _multinomial = require("./function/probability/multinomial.js");
|
|
@@ -904,6 +922,8 @@ var _varianceTransform = require("./expression/transform/variance.transform.js")
|
|
|
904
922
|
var _clone = require("./function/utils/clone.js");
|
|
905
923
|
var _isNumeric = require("./function/utils/isNumeric.js");
|
|
906
924
|
var _hasNumericValue = require("./function/utils/hasNumericValue.js");
|
|
925
|
+
var _isBounded = require("./function/utils/isBounded.js");
|
|
926
|
+
var _isFinite = require("./function/utils/isFinite.js");
|
|
907
927
|
var _typeOf = require("./function/utils/typeOf.js");
|
|
908
928
|
var _isPrime = require("./function/utils/isPrime.js");
|
|
909
929
|
var _numeric = require("./function/utils/numeric.js");
|
|
@@ -986,6 +1006,7 @@ const createSubset = exports.createSubset = /* #__PURE__ */(0, _factory.factory)
|
|
|
986
1006
|
// TODO: create range implementation for range?
|
|
987
1007
|
|
|
988
1008
|
// probability
|
|
1009
|
+
|
|
989
1010
|
const createCombinations = exports.createCombinations = createNumberFactory('combinations', _index.combinationsNumber);
|
|
990
1011
|
const createGamma = exports.createGamma = createNumberFactory('gamma', _index.gammaNumber);
|
|
991
1012
|
const createLgamma = exports.createLgamma = createNumberFactory('lgamma', _index.lgammaNumber);
|
|
@@ -52,6 +52,10 @@ const createPolynomialRoot = exports.createPolynomialRoot = /* #__PURE__ */(0, _
|
|
|
52
52
|
* See also:
|
|
53
53
|
* cbrt, sqrt
|
|
54
54
|
*
|
|
55
|
+
* History:
|
|
56
|
+
*
|
|
57
|
+
* v11.4 Created
|
|
58
|
+
*
|
|
55
59
|
* @param {... number | Complex} coeffs
|
|
56
60
|
* The coefficients of the polynomial, starting with with the constant coefficent, followed
|
|
57
61
|
* by the linear coefficient and subsequent coefficients of increasing powers.
|
|
@@ -10,13 +10,14 @@ var _number = require("../../utils/number.js");
|
|
|
10
10
|
var _util = require("./simplify/util.js");
|
|
11
11
|
var _noop = require("../../utils/noop.js");
|
|
12
12
|
const name = 'simplifyConstant';
|
|
13
|
-
const dependencies = ['typed', 'config', 'mathWithTransform', 'matrix', '?fraction', '?bignumber', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode'];
|
|
13
|
+
const dependencies = ['typed', 'config', 'mathWithTransform', 'matrix', 'isBounded', '?fraction', '?bignumber', 'AccessorNode', 'ArrayNode', 'ConstantNode', 'FunctionNode', 'IndexNode', 'ObjectNode', 'OperatorNode', 'SymbolNode'];
|
|
14
14
|
const createSimplifyConstant = exports.createSimplifyConstant = /* #__PURE__ */(0, _factory.factory)(name, dependencies, _ref => {
|
|
15
15
|
let {
|
|
16
16
|
typed,
|
|
17
17
|
config,
|
|
18
18
|
mathWithTransform,
|
|
19
19
|
matrix,
|
|
20
|
+
isBounded,
|
|
20
21
|
fraction,
|
|
21
22
|
bignumber,
|
|
22
23
|
AccessorNode,
|
|
@@ -134,7 +135,7 @@ const createSimplifyConstant = exports.createSimplifyConstant = /* #__PURE__ */(
|
|
|
134
135
|
// and when both numerator and denominator are small enough
|
|
135
136
|
function _exactFraction(n, options) {
|
|
136
137
|
const exactFractions = options && options.exactFractions !== false;
|
|
137
|
-
if (exactFractions &&
|
|
138
|
+
if (exactFractions && isBounded(n) && fraction) {
|
|
138
139
|
const f = fraction(n);
|
|
139
140
|
const fractionsLimit = options && typeof options.fractionsLimit === 'number' ? options.fractionsLimit : Infinity; // no limit by default
|
|
140
141
|
|
|
@@ -59,7 +59,7 @@ const createAdd = exports.createAdd = /* #__PURE__ */(0, _factory.factory)(name,
|
|
|
59
59
|
*
|
|
60
60
|
* const c = math.unit('5 cm')
|
|
61
61
|
* const d = math.unit('2.1 mm')
|
|
62
|
-
* math.add(c, d) // returns Unit
|
|
62
|
+
* math.add(c, d) // returns Unit 5.21 cm
|
|
63
63
|
*
|
|
64
64
|
* math.add("2.3", "4") // returns number 6.3
|
|
65
65
|
*
|
|
@@ -67,6 +67,13 @@ const createAdd = exports.createAdd = /* #__PURE__ */(0, _factory.factory)(name,
|
|
|
67
67
|
*
|
|
68
68
|
* subtract, sum
|
|
69
69
|
*
|
|
70
|
+
* History:
|
|
71
|
+
*
|
|
72
|
+
* v13 Handle bigint arguments
|
|
73
|
+
* v11.6 Support matrix broadcasting
|
|
74
|
+
* v3.8 Allow more than two arguments
|
|
75
|
+
* v0.0.2 Created
|
|
76
|
+
*
|
|
70
77
|
* @param {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} x First value to add
|
|
71
78
|
* @param {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} y Second value to add
|
|
72
79
|
* @return {number | BigNumber | bigint | Fraction | Complex | Unit | Array | Matrix} Sum of `x` and `y`
|
|
@@ -41,17 +41,18 @@ const createCbrt = exports.createCbrt = /* #__PURE__ */(0, _factory.factory)(nam
|
|
|
41
41
|
* math.map([27, 64, 125], x => math.cbrt(x)) // returns [3, 4, 5]
|
|
42
42
|
*
|
|
43
43
|
* const x = math.complex('8i')
|
|
44
|
-
* math.cbrt(x) // returns
|
|
45
|
-
* math.cbrt(x, true)
|
|
46
|
-
*
|
|
47
|
-
* // -1.7320508075689 + i
|
|
48
|
-
* // -2i
|
|
49
|
-
* // ]
|
|
44
|
+
* math.cbrt(x) // returns 1.7320508075689 + i ...
|
|
45
|
+
* math.cbrt(x, true)
|
|
46
|
+
* // Complex Matrix ["1.7320508075689+i", "-1.7320508075689+i", "-2i"]
|
|
50
47
|
*
|
|
51
48
|
* See also:
|
|
52
49
|
*
|
|
53
50
|
* square, sqrt, cube
|
|
54
51
|
*
|
|
52
|
+
* History:
|
|
53
|
+
*
|
|
54
|
+
* v2.3 Created
|
|
55
|
+
*
|
|
55
56
|
* @param {number | BigNumber | Complex | Unit} x
|
|
56
57
|
* Value for which to calculate the cubic root.
|
|
57
58
|
* @param {boolean} [allRoots] Optional, false by default. Only applicable
|
|
@@ -106,13 +106,13 @@ const createCeil = exports.createCeil = /* #__PURE__ */(0, _factory.factory)(nam
|
|
|
106
106
|
* math.ceil(-4.782, 2) // returns number -4.78
|
|
107
107
|
*
|
|
108
108
|
* const c = math.complex(3.24, -2.71)
|
|
109
|
-
* math.ceil(c) // returns Complex 4 - 2i
|
|
109
|
+
* math.ceil(c) // returns Complex 4 - 2i ...
|
|
110
110
|
* math.ceil(c, 1) // returns Complex 3.3 - 2.7i
|
|
111
111
|
*
|
|
112
112
|
* const unit = math.unit('3.241 cm')
|
|
113
113
|
* const cm = math.unit('cm')
|
|
114
114
|
* const mm = math.unit('mm')
|
|
115
|
-
* math.ceil(unit, 1, cm) // returns Unit 3.3 cm
|
|
115
|
+
* math.ceil(unit, 1, cm) // returns Unit 3.3 cm ...
|
|
116
116
|
* math.ceil(unit, 1, mm) // returns Unit 32.5 mm
|
|
117
117
|
*
|
|
118
118
|
* math.ceil([3.2, 3.8, -4.7]) // returns Array [4, 4, -4]
|
|
@@ -122,6 +122,14 @@ const createCeil = exports.createCeil = /* #__PURE__ */(0, _factory.factory)(nam
|
|
|
122
122
|
*
|
|
123
123
|
* floor, fix, round
|
|
124
124
|
*
|
|
125
|
+
* History:
|
|
126
|
+
*
|
|
127
|
+
* v14 Handle Units
|
|
128
|
+
* v7.4 Allow second "precision" argument
|
|
129
|
+
* v5.7 Support tolerance for round-off errors
|
|
130
|
+
* v2 Handle Fractions
|
|
131
|
+
* v0.1 Created
|
|
132
|
+
*
|
|
125
133
|
* @param {number | BigNumber | Fraction | Complex | Unit | Array | Matrix} x Value to be rounded
|
|
126
134
|
* @param {number | BigNumber | Array} [n=0] Number of decimals
|
|
127
135
|
* @param {Unit} [valuelessUnit] A valueless unit
|
|
@@ -29,16 +29,18 @@ const createExp = exports.createExp = /* #__PURE__ */(0, _factory.factory)(name,
|
|
|
29
29
|
* math.log(math.exp(2)) // returns number 2
|
|
30
30
|
*
|
|
31
31
|
* math.map([1, 2, 3], math.exp)
|
|
32
|
-
* // returns
|
|
33
|
-
* // 2.718281828459045,
|
|
34
|
-
* // 7.3890560989306495,
|
|
35
|
-
* // 20.085536923187668
|
|
36
|
-
* // ]
|
|
32
|
+
* // returns [2.718281828459045, 7.3890560989306495, 20.085536923187668]
|
|
37
33
|
*
|
|
38
34
|
* See also:
|
|
39
35
|
*
|
|
40
36
|
* expm1, expm, log, pow
|
|
41
37
|
*
|
|
38
|
+
* History:
|
|
39
|
+
*
|
|
40
|
+
* v11 Don't apply elementwise, avoid confusion with matrix exponential
|
|
41
|
+
* v0.20 Handle BigNumbers
|
|
42
|
+
* v0.0.2 Created
|
|
43
|
+
*
|
|
42
44
|
* @param {number | BigNumber | Complex} x A number to exponentiate
|
|
43
45
|
* @return {number | BigNumber | Complex} Exponential of `x`
|
|
44
46
|
*/
|
|
@@ -33,16 +33,17 @@ const createExpm1 = exports.createExpm1 = /* #__PURE__ */(0, _factory.factory)(n
|
|
|
33
33
|
* math.log(math.expm1(2) + 1) // returns number 2
|
|
34
34
|
*
|
|
35
35
|
* math.map([1, 2, 3], math.expm1)
|
|
36
|
-
* // returns
|
|
37
|
-
* // 1.718281828459045,
|
|
38
|
-
* // 6.3890560989306495,
|
|
39
|
-
* // 19.085536923187668
|
|
40
|
-
* // ]
|
|
36
|
+
* // returns [1.718281828459045, 6.3890560989306495, 19.085536923187668]
|
|
41
37
|
*
|
|
42
38
|
* See also:
|
|
43
39
|
*
|
|
44
40
|
* exp, expm, log, pow
|
|
45
41
|
*
|
|
42
|
+
* History:
|
|
43
|
+
*
|
|
44
|
+
* v11 Don't apply elementwise, avoids confusion with matrix exponential
|
|
45
|
+
* v4.2 Created
|
|
46
|
+
*
|
|
46
47
|
* @param {number | BigNumber | Complex} x The number to exponentiate
|
|
47
48
|
* @return {number | BigNumber | Complex} Exponential of `x`, minus one
|
|
48
49
|
*/
|