mathjs 10.5.0 → 10.5.1

Sign up to get free protection for your applications and to get access to all the features.
Files changed (82) hide show
  1. package/HISTORY.md +12 -0
  2. package/docs/datatypes/matrices.md +17 -0
  3. package/docs/expressions/syntax.md +4 -1
  4. package/docs/reference/functions/fix.md +1 -0
  5. package/docs/reference/functions/floor.md +4 -0
  6. package/docs/reference/functions/resolve.md +2 -2
  7. package/docs/reference/functions/simplifyConstant.md +52 -0
  8. package/lib/browser/math.js +5 -5
  9. package/lib/browser/math.js.map +1 -1
  10. package/lib/cjs/entry/dependenciesAny/dependenciesCeil.generated.js +6 -0
  11. package/lib/cjs/entry/dependenciesAny/dependenciesFix.generated.js +9 -0
  12. package/lib/cjs/entry/dependenciesAny/dependenciesFloor.generated.js +6 -0
  13. package/lib/cjs/entry/dependenciesAny/dependenciesIndexNode.generated.js +0 -3
  14. package/lib/cjs/entry/dependenciesNumber/dependenciesCeil.generated.js +3 -0
  15. package/lib/cjs/entry/dependenciesNumber/dependenciesFix.generated.js +6 -0
  16. package/lib/cjs/entry/dependenciesNumber/dependenciesFloor.generated.js +3 -0
  17. package/lib/cjs/entry/dependenciesNumber/dependenciesIndexNode.generated.js +0 -3
  18. package/lib/cjs/entry/impureFunctionsAny.generated.js +0 -1
  19. package/lib/cjs/entry/impureFunctionsNumber.generated.js +6 -7
  20. package/lib/cjs/entry/pureFunctionsAny.generated.js +10 -3
  21. package/lib/cjs/entry/pureFunctionsNumber.generated.js +21 -15
  22. package/lib/cjs/expression/node/IndexNode.js +26 -61
  23. package/lib/cjs/factoriesNumber.js +29 -24
  24. package/lib/cjs/function/algebra/resolve.js +3 -3
  25. package/lib/cjs/function/arithmetic/ceil.js +75 -39
  26. package/lib/cjs/function/arithmetic/fix.js +54 -16
  27. package/lib/cjs/function/arithmetic/floor.js +79 -37
  28. package/lib/cjs/function/arithmetic/nthRoot.js +1 -3
  29. package/lib/cjs/function/arithmetic/round.js +27 -47
  30. package/lib/cjs/header.js +2 -2
  31. package/lib/cjs/plain/number/arithmetic.js +9 -27
  32. package/lib/cjs/type/matrix/function/sparse.js +6 -0
  33. package/lib/cjs/utils/lruQueue.js +1 -3
  34. package/lib/cjs/utils/object.js +3 -1
  35. package/lib/cjs/version.js +1 -1
  36. package/lib/esm/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
  37. package/lib/esm/entry/dependenciesAny/dependenciesFix.generated.js +6 -0
  38. package/lib/esm/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
  39. package/lib/esm/entry/dependenciesAny/dependenciesIndexNode.generated.js +0 -2
  40. package/lib/esm/entry/dependenciesNumber/dependenciesCeil.generated.js +2 -0
  41. package/lib/esm/entry/dependenciesNumber/dependenciesFix.generated.js +4 -0
  42. package/lib/esm/entry/dependenciesNumber/dependenciesFloor.generated.js +2 -0
  43. package/lib/esm/entry/dependenciesNumber/dependenciesIndexNode.generated.js +0 -2
  44. package/lib/esm/entry/impureFunctionsAny.generated.js +0 -1
  45. package/lib/esm/entry/impureFunctionsNumber.generated.js +7 -8
  46. package/lib/esm/entry/pureFunctionsAny.generated.js +10 -3
  47. package/lib/esm/entry/pureFunctionsNumber.generated.js +16 -10
  48. package/lib/esm/expression/node/BlockNode.js +3 -3
  49. package/lib/esm/expression/node/IndexNode.js +22 -59
  50. package/lib/esm/expression/parse.js +5 -5
  51. package/lib/esm/factoriesNumber.js +6 -6
  52. package/lib/esm/function/algebra/decomposition/qr.js +2 -2
  53. package/lib/esm/function/algebra/resolve.js +3 -3
  54. package/lib/esm/function/algebra/solver/utils/solveValidation.js +5 -5
  55. package/lib/esm/function/algebra/sparse/csChol.js +2 -2
  56. package/lib/esm/function/algebra/sparse/csLeaf.js +2 -2
  57. package/lib/esm/function/algebra/sparse/csLu.js +3 -3
  58. package/lib/esm/function/arithmetic/ceil.js +61 -24
  59. package/lib/esm/function/arithmetic/fix.js +51 -13
  60. package/lib/esm/function/arithmetic/floor.js +65 -23
  61. package/lib/esm/function/arithmetic/nthRoot.js +1 -3
  62. package/lib/esm/function/arithmetic/nthRoots.js +1 -1
  63. package/lib/esm/function/arithmetic/round.js +25 -43
  64. package/lib/esm/function/matrix/expm.js +2 -2
  65. package/lib/esm/function/probability/gamma.js +1 -1
  66. package/lib/esm/function/string/bin.js +1 -1
  67. package/lib/esm/function/string/hex.js +1 -1
  68. package/lib/esm/function/string/oct.js +1 -1
  69. package/lib/esm/plain/number/arithmetic.js +9 -17
  70. package/lib/esm/type/complex/Complex.js +2 -2
  71. package/lib/esm/type/matrix/DenseMatrix.js +2 -2
  72. package/lib/esm/type/matrix/FibonacciHeap.js +2 -2
  73. package/lib/esm/type/matrix/SparseMatrix.js +13 -13
  74. package/lib/esm/type/matrix/function/sparse.js +6 -0
  75. package/lib/esm/type/unit/Unit.js +7 -7
  76. package/lib/esm/utils/lruQueue.js +1 -2
  77. package/lib/esm/utils/number.js +3 -3
  78. package/lib/esm/utils/object.js +3 -1
  79. package/lib/esm/version.js +1 -1
  80. package/package.json +14 -3
  81. package/types/index.d.ts +1794 -1372
  82. package/types/index.ts +697 -266
package/types/index.ts CHANGED
@@ -7,8 +7,9 @@ import {
7
7
  addDependencies,
8
8
  divideDependencies,
9
9
  formatDependencies,
10
- } from 'mathjs';
11
- import * as assert from 'assert';
10
+ MathNode,
11
+ } from 'mathjs'
12
+ import * as assert from 'assert'
12
13
  import { expectTypeOf } from 'expect-type'
13
14
 
14
15
  // This file serves a dual purpose:
@@ -19,57 +20,73 @@ import { expectTypeOf } from 'expect-type'
19
20
  Basic usage examples
20
21
  */
21
22
  {
22
- const math = create(all);
23
+ const math = create(all)
24
+
25
+ const m2by2 = [
26
+ [-1, 2],
27
+ [3, 1],
28
+ ]
29
+ const m2by3 = [
30
+ [1, 2, 3],
31
+ [4, 5, 6],
32
+ ]
23
33
 
24
34
  // functions and constants
25
- math.round(math.e, 3);
26
- math.round(100.123, 3);
27
- math.atan2(3, -3) / math.pi;
28
- math.log(10000, 10);
29
- math.sqrt(-4);
30
- math.pow([[-1, 2], [3, 1]], 2);
31
- const angle = 0.2;
32
- math.add(math.pow(math.sin(angle), 2), math.pow(math.cos(angle), 2));
35
+ math.round(math.e, 3)
36
+ math.round(100.123, 3)
37
+ math.atan2(3, -3) / math.pi
38
+ math.log(10000, 10)
39
+ math.sqrt(-4)
40
+
41
+ math.pow(m2by2, 2)
42
+ const angle = 0.2
43
+ math.add(math.pow(math.sin(angle), 2), math.pow(math.cos(angle), 2))
33
44
 
34
45
  // std and variance check
46
+
35
47
  math.std(1, 2, 3)
36
48
  math.std([1, 2, 3])
37
- math.std([1, 2, 3], "biased")
38
- math.std([1,2, 3], 0, "biased")
39
- math.std([[1,2,3], [4,5,6]], 1, "unbiased")
40
- math.std([[1,2,3], [4,5,6]], 1, "uncorrected")
49
+ math.std([1, 2, 3], 'biased')
50
+ math.std([1, 2, 3], 0, 'biased')
51
+ math.std(m2by3, 1, 'unbiased')
52
+ math.std(m2by3, 1, 'uncorrected')
41
53
  math.variance(1, 2, 3)
42
54
  math.variance([1, 2, 3])
43
- math.variance([1, 2, 3], "biased")
44
- math.variance([1,2, 3], 0, "biased")
45
- math.variance([[1,2,3], [4,5,6]], 1, "unbiased")
46
- math.variance([[1,2,3], [4,5,6]], 1, "uncorrected")
55
+ math.variance([1, 2, 3], 'biased')
56
+ math.variance([1, 2, 3], 0, 'biased')
57
+ math.variance(m2by3, 1, 'unbiased')
58
+ math.variance(m2by3, 1, 'uncorrected')
47
59
 
48
60
  // std and variance on chain
49
- math.chain([1, 2, 3]).std("unbiased")
50
- math.chain([[1, 2, 3], [4, 5, 6]]).std(0, "biased").std(0, "uncorrected")
51
- math.chain([[1, 2, 3], [4, 5, 6]]).std(0, "biased").std(0, "uncorrected")
52
- math.chain([1, 2, 3]).std("unbiased")
53
- math.chain([[1, 2, 3], [4, 5, 6]]).variance(0, "biased")
54
- math.chain([[1, 2, 3], [4, 5, 6]]).variance(1, "uncorrected").variance("unbiased")
55
-
61
+ math.chain([1, 2, 3]).std('unbiased')
62
+ math.chain(m2by3).std(0, 'biased').std(0, 'uncorrected')
63
+ math.chain(m2by3).std(0, 'biased').std(0, 'uncorrected')
64
+ math.chain([1, 2, 3]).std('unbiased')
65
+ math.chain(m2by3).variance(0, 'biased')
66
+ math.chain(m2by3).variance(1, 'uncorrected').variance('unbiased')
56
67
 
57
68
  // expressions
58
- math.evaluate('1.2 * (2 + 4.5)');
69
+ math.evaluate('1.2 * (2 + 4.5)')
59
70
 
60
71
  // chained operations
61
- const a = math.chain(3).add(4).multiply(2).done();
62
- assert.strictEqual(a, 14);
72
+ const a = math.chain(3).add(4).multiply(2).done()
73
+ assert.strictEqual(a, 14)
63
74
 
64
75
  // mixed use of different data types in functions
65
- assert.deepStrictEqual(math.add(4, [5, 6]), [9, 10]); // number + Array
66
- assert.deepStrictEqual(math.multiply(math.unit('5 mm'), 3), math.unit('15 mm')); // Unit * number
67
- assert.deepStrictEqual(math.subtract([2, 3, 4], 5), [-3, -2, -1]); // Array - number
68
- assert.deepStrictEqual(math.add(math.matrix([2, 3]), [4, 5]), math.matrix([6, 8])); // Matrix + Array
76
+ assert.deepStrictEqual(math.add(4, [5, 6]), [9, 10]) // number + Array
77
+ assert.deepStrictEqual(
78
+ math.multiply(math.unit('5 mm'), 3),
79
+ math.unit('15 mm')
80
+ ) // Unit * number
81
+ assert.deepStrictEqual(math.subtract([2, 3, 4], 5), [-3, -2, -1]) // Array - number
82
+ assert.deepStrictEqual(
83
+ math.add(math.matrix([2, 3]), [4, 5]),
84
+ math.matrix([6, 8])
85
+ ) // Matrix + Array
69
86
 
70
87
  // narrowed type inference
71
- const b: math.Matrix = math.add(math.matrix([2]), math.matrix([3]));
72
- const c: math.Matrix = math.subtract(math.matrix([4]), math.matrix([5]));
88
+ const _b: math.Matrix = math.add(math.matrix([2]), math.matrix([3]))
89
+ const _c: math.Matrix = math.subtract(math.matrix([4]), math.matrix([5]))
73
90
  }
74
91
 
75
92
  /*
@@ -80,11 +97,17 @@ Bignumbers examples
80
97
  const math = create(all, {
81
98
  number: 'BigNumber',
82
99
  precision: 20,
83
- });
100
+ })
84
101
 
85
102
  {
86
- assert.deepStrictEqual(math.add(math.bignumber(0.1), math.bignumber(0.2)), math.bignumber(0.3));
87
- assert.deepStrictEqual(math.divide(math.bignumber(0.3), math.bignumber(0.2)), math.bignumber(1.5));
103
+ assert.deepStrictEqual(
104
+ math.add(math.bignumber(0.1), math.bignumber(0.2)),
105
+ math.bignumber(0.3)
106
+ )
107
+ assert.deepStrictEqual(
108
+ math.divide(math.bignumber(0.3), math.bignumber(0.2)),
109
+ math.bignumber(1.5)
110
+ )
88
111
  }
89
112
  }
90
113
 
@@ -92,29 +115,29 @@ Bignumbers examples
92
115
  Chaining examples
93
116
  */
94
117
  {
95
- const math = create(all, {});
96
- const a = math.chain(3).add(4).multiply(2).done();
97
- assert.strictEqual(a, 14);
118
+ const math = create(all, {})
119
+ const a = math.chain(3).add(4).multiply(2).done()
120
+ assert.strictEqual(a, 14)
98
121
 
99
122
  // Another example, calculate square(sin(pi / 4))
100
- const b = math.chain(math.pi).divide(4).sin().square().done();
123
+ const _b = math.chain(math.pi).divide(4).sin().square().done()
101
124
 
102
125
  // toString will return a string representation of the chain's value
103
- const chain = math.chain(2).divide(3);
104
- const str: string = chain.toString();
105
- assert.strictEqual(str, "0.6666666666666666");
126
+ const chain = math.chain(2).divide(3)
127
+ const str: string = chain.toString()
128
+ assert.strictEqual(str, '0.6666666666666666')
106
129
 
107
- chain.valueOf();
130
+ chain.valueOf()
108
131
 
109
132
  // the function subset can be used to get or replace sub matrices
110
133
  const array = [
111
134
  [1, 2],
112
135
  [3, 4],
113
- ];
114
- const v = math.chain(array).subset(math.index(1, 0)).done();
115
- assert.strictEqual(v, 3);
136
+ ]
137
+ const v = math.chain(array).subset(math.index(1, 0)).done()
138
+ assert.strictEqual(v, 3)
116
139
 
117
- const m = math.chain(array).subset(math.index(0, 0), 8).multiply(3).done();
140
+ const _m = math.chain(array).subset(math.index(0, 0), 8).multiply(3).done()
118
141
 
119
142
  // filtering
120
143
  assert.deepStrictEqual(
@@ -125,64 +148,74 @@ Chaining examples
125
148
  .filter((n) => n !== 1000)
126
149
  .done(),
127
150
  [2, 3]
128
- );
151
+ )
152
+
153
+ const r = math.chain(-0.483).round([0, 1, 2]).floor().add(0.52).fix(1).done()
154
+ assert.deepStrictEqual(r, [0.5, -0.4, -0.4])
155
+
156
+ expectTypeOf(math.chain('x + y').parse().resolve({ x: 1 }).done())
157
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
158
+ .toMatchTypeOf<any>()
159
+ expectTypeOf(math.chain('x + y').parse().resolve().done())
160
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
161
+ .toMatchTypeOf<any>()
129
162
  }
130
163
 
131
164
  /*
132
165
  Simplify examples
133
166
  */
134
167
  {
135
- const math = create(all);
168
+ const math = create(all)
136
169
 
137
- math.simplify("2 * 1 * x ^ (2 - 1)");
138
- math.simplify("2 * 3 * x", { x: 4 });
170
+ math.simplify('2 * 1 * x ^ (2 - 1)')
171
+ math.simplify('2 * 3 * x', { x: 4 })
139
172
 
140
- const f = math.parse("2 * 1 * x ^ (2 - 1)");
141
- math.simplify(f);
173
+ const f = math.parse('2 * 1 * x ^ (2 - 1)')
174
+ math.simplify(f)
142
175
 
143
- math.simplify("0.4 * x", {}, { exactFractions: true });
144
- math.simplify("0.4 * x", {}, { exactFractions: false });
176
+ math.simplify('0.4 * x', {}, { exactFractions: true })
177
+ math.simplify('0.4 * x', {}, { exactFractions: false })
145
178
  }
146
179
 
147
180
  /*
148
181
  Complex numbers examples
149
182
  */
150
183
  {
151
- const math = create(all, {});
152
- const a = math.complex(2, 3);
184
+ const math = create(all, {})
185
+ const a = math.complex(2, 3)
153
186
  // create a complex number by providing a string with real and complex parts
154
- const b = math.complex('3 - 7i');
187
+ const b = math.complex('3 - 7i')
155
188
 
156
189
  // read the real and complex parts of the complex number
157
190
  {
158
- const x: number = a.re;
159
- const y: number = a.im;
191
+ const _x: number = a.re
192
+ const _y: number = a.im
160
193
 
161
194
  // adjust the complex value
162
- a.re = 5;
195
+ a.re = 5
163
196
  }
164
197
 
165
198
  // clone a complex value
166
199
  {
167
- const clone = a.clone();
200
+ const _clone = a.clone()
168
201
  }
169
202
 
170
203
  // perform operations with complex numbers
171
204
  {
172
- math.add(a, b);
173
- math.multiply(a, b);
174
- math.sin(a);
205
+ math.add(a, b)
206
+ math.multiply(a, b)
207
+ math.sin(a)
175
208
  }
176
209
 
177
210
  // create a complex number from polar coordinates
178
211
  {
179
- const p: math.PolarCoordinates = { r: math.sqrt(2), phi: math.pi / 4 };
180
- const c: math.Complex = math.complex(p);
212
+ const p: math.PolarCoordinates = { r: math.sqrt(2), phi: math.pi / 4 }
213
+ const _c: math.Complex = math.complex(p)
181
214
  }
182
215
 
183
216
  // get polar coordinates of a complex number
184
217
  {
185
- const p: math.PolarCoordinates = math.complex(3, 4).toPolar();
218
+ const _p: math.PolarCoordinates = math.complex(3, 4).toPolar()
186
219
  }
187
220
  }
188
221
 
@@ -190,78 +223,79 @@ Complex numbers examples
190
223
  Expressions examples
191
224
  */
192
225
  {
193
- const math = create(all, {});
226
+ const math = create(all, {})
194
227
  // evaluate expressions
195
228
  {
196
- math.evaluate('sqrt(3^2 + 4^2)');
229
+ math.evaluate('sqrt(3^2 + 4^2)')
197
230
  }
198
231
 
199
232
  // evaluate multiple expressions at once
200
233
  {
201
- math.evaluate(['f = 3', 'g = 4', 'f * g']);
234
+ math.evaluate(['f = 3', 'g = 4', 'f * g'])
202
235
  }
203
236
 
204
237
  // get content of a parenthesis node
205
238
  {
206
- const node = math.parse('(1)');
239
+ const node = math.parse('(1)')
207
240
  if (node.type !== 'ParenthesisNode') {
208
- throw Error(`expected ParenthesisNode, got ${node.type}`);
241
+ throw Error(`expected ParenthesisNode, got ${node.type}`)
209
242
  }
210
- const innerNode = node.content;
243
+ const _innerNode = node.content
211
244
  }
212
245
 
213
246
  // scope can contain both variables and functions
214
247
  {
215
- const scope = { hello: (name: string) => `hello, ${name}!` };
216
- assert.strictEqual(math.evaluate('hello("hero")', scope), "hello, hero!");
248
+ const scope = { hello: (name: string) => `hello, ${name}!` }
249
+ assert.strictEqual(math.evaluate('hello("hero")', scope), 'hello, hero!')
217
250
  }
218
251
 
219
252
  // define a function as an expression
220
253
  {
254
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
221
255
  const scope: any = {
222
256
  a: 3,
223
257
  b: 4,
224
- };
225
- const f = math.evaluate('f(x) = x ^ a', scope);
226
- f(2);
227
- scope.f(2);
258
+ }
259
+ const f = math.evaluate('f(x) = x ^ a', scope)
260
+ f(2)
261
+ scope.f(2)
228
262
  }
229
263
 
230
264
  {
231
- const node2 = math.parse('x^a');
232
- const code2: math.EvalFunction = node2.compile();
233
- node2.toString();
265
+ const node2 = math.parse('x^a')
266
+ const _code2: math.EvalFunction = node2.compile()
267
+ node2.toString()
234
268
  }
235
269
 
236
270
  // 3. using function math.compile
237
271
  // parse an expression
238
272
  {
239
273
  // provide a scope for the variable assignment
240
- const code2 = math.compile('a = a + 3');
241
- const scope = { a: 7 };
242
- code2.evaluate(scope);
274
+ const code2 = math.compile('a = a + 3')
275
+ const scope = { a: 7 }
276
+ code2.evaluate(scope)
243
277
  }
244
278
  // 4. using a parser
245
- const parser = math.parser();
279
+ const parser = math.parser()
246
280
 
247
281
  // get and set variables and functions
248
282
  {
249
- assert.strictEqual(parser.evaluate('x = 7 / 2'), 3.5);
250
- assert.strictEqual(parser.evaluate('x + 3'), 6.5);
251
- parser.evaluate('f(x, y) = x^y'); // f(x, y)
252
- assert.strictEqual(parser.evaluate('f(2, 3)'), 8);
253
-
254
- const x = parser.get('x');
255
- const f = parser.get('f');
256
- const y = parser.getAll();
257
- const g = f(3, 3);
258
-
259
- parser.set('h', 500);
260
- parser.set('hello', (name: string) => `hello, ${name}!`);
283
+ assert.strictEqual(parser.evaluate('x = 7 / 2'), 3.5)
284
+ assert.strictEqual(parser.evaluate('x + 3'), 6.5)
285
+ parser.evaluate('f(x, y) = x^y') // f(x, y)
286
+ assert.strictEqual(parser.evaluate('f(2, 3)'), 8)
287
+
288
+ const _x = parser.get('x')
289
+ const f = parser.get('f')
290
+ const _y = parser.getAll()
291
+ const _g = f(3, 3)
292
+
293
+ parser.set('h', 500)
294
+ parser.set('hello', (name: string) => `hello, ${name}!`)
261
295
  }
262
296
 
263
297
  // clear defined functions and variables
264
- parser.clear();
298
+ parser.clear()
265
299
  }
266
300
 
267
301
  /*
@@ -271,114 +305,122 @@ Fractions examples
271
305
  // configure the default type of numbers as Fractions
272
306
  const math = create(all, {
273
307
  number: 'Fraction',
274
- });
308
+ })
275
309
 
276
- const x = math.fraction(0.125);
277
- const y = math.fraction('1/3');
278
- math.fraction(2, 3);
310
+ const x = math.fraction(0.125)
311
+ const y = math.fraction('1/3')
312
+ math.fraction(2, 3)
279
313
 
280
- math.add(x, y);
281
- math.divide(x, y);
314
+ math.add(x, y)
315
+ math.divide(x, y)
282
316
 
283
317
  // output formatting
284
- const a = math.fraction('2/3');
318
+ const _a = math.fraction('2/3')
285
319
  }
286
320
 
287
321
  /*
288
322
  Matrices examples
289
323
  */
290
324
  {
291
- const math = create(all, {});
325
+ const math = create(all, {})
292
326
 
293
327
  // create matrices and arrays. a matrix is just a wrapper around an Array,
294
328
  // providing some handy utilities.
295
- const a: math.Matrix = math.matrix([1, 4, 9, 16, 25]);
296
- const b: math.Matrix = math.matrix(math.ones([2, 3]));
297
- b.size();
329
+ const a: math.Matrix = math.matrix([1, 4, 9, 16, 25])
330
+ const b: math.Matrix = math.matrix(math.ones([2, 3]))
331
+ b.size()
298
332
 
299
333
  // the Array data of a Matrix can be retrieved using valueOf()
300
- const array = a.valueOf();
334
+ const _array = a.valueOf()
301
335
 
302
336
  // Matrices can be cloned
303
- const clone: math.Matrix = a.clone();
337
+ const _clone: math.Matrix = a.clone()
304
338
 
305
339
  // perform operations with matrices
306
- math.sqrt(a);
307
- math.factorial(a);
340
+ math.sqrt(a)
341
+ math.factorial(a)
308
342
 
309
343
  // create and manipulate matrices. Arrays and Matrices can be used mixed.
310
344
  {
311
345
  const a = [
312
346
  [1, 2],
313
347
  [3, 4],
314
- ];
348
+ ]
315
349
  const b: math.Matrix = math.matrix([
316
350
  [5, 6],
317
351
  [1, 1],
318
- ]);
352
+ ])
319
353
 
320
- b.subset(math.index(1, [0, 1]), [[7, 8]]);
321
- const c = math.multiply(a, b);
322
- const f: math.Matrix = math.matrix([1, 0]);
323
- const d: math.Matrix = f.subset(math.index(1));
354
+ b.subset(math.index(1, [0, 1]), [[7, 8]])
355
+ const _c = math.multiply(a, b)
356
+ const f: math.Matrix = math.matrix([1, 0])
357
+ const _d: math.Matrix = f.subset(math.index(1))
324
358
  }
325
359
 
326
360
  // get a sub matrix
327
361
  {
328
- const a: math.Matrix = math.diag(math.range(1, 4));
329
- a.subset(math.index([1, 2], [1, 2]));
330
- const b: math.Matrix = math.range(1, 6);
331
- b.subset(math.index(math.range(1, 4)));
362
+ const a: math.Matrix = math.diag(math.range(1, 4))
363
+ a.subset(math.index([1, 2], [1, 2]))
364
+ const b: math.Matrix = math.range(1, 6)
365
+ b.subset(math.index(math.range(1, 4)))
332
366
  }
333
367
 
334
368
  // resize a multi dimensional matrix
335
369
  {
336
- const a = math.matrix();
337
- a.resize([2, 2, 2], 0);
338
- a.size();
339
- a.resize([2, 2]);
340
- a.size();
370
+ const a = math.matrix()
371
+ a.resize([2, 2, 2], 0)
372
+ a.size()
373
+ a.resize([2, 2])
374
+ a.size()
341
375
  }
342
376
 
343
377
  // can set a subset of a matrix to uninitialized
344
378
  {
345
- const m = math.matrix();
346
- m.subset(math.index(2), 6, math.uninitialized);
379
+ const m = math.matrix()
380
+ m.subset(math.index(2), 6, math.uninitialized)
347
381
  }
348
382
 
349
383
  // create ranges
350
384
  {
351
- math.range(1, 6);
352
- math.range(0, 18, 3);
353
- math.range('2:-1:-3');
354
- math.factorial(math.range('1:6'));
385
+ math.range(1, 6)
386
+ math.range(0, 18, 3)
387
+ math.range('2:-1:-3')
388
+ math.factorial(math.range('1:6'))
355
389
  }
356
390
 
357
391
  // map matrix
358
392
  {
359
393
  assert.deepStrictEqual(
360
394
  math.map([1, 2, 3], function (value) {
361
- return value * value;
395
+ return value * value
362
396
  }),
363
397
  [1, 4, 9]
364
- );
398
+ )
365
399
  }
366
400
 
367
401
  // filter matrix
368
402
  {
369
403
  assert.deepStrictEqual(
370
404
  math.filter([6, -2, -1, 4, 3], function (x) {
371
- return x > 0;
405
+ return x > 0
372
406
  }),
373
407
  [6, 4, 3]
374
408
  )
375
- assert.deepStrictEqual(math.filter(['23', 'foo', '100', '55', 'bar'], /[0-9]+/), ["23", "100", "55"]);
409
+ assert.deepStrictEqual(
410
+ math.filter(['23', 'foo', '100', '55', 'bar'], /[0-9]+/),
411
+ ['23', '100', '55']
412
+ )
376
413
  }
377
414
 
378
415
  // concat matrix
379
416
  {
380
- assert.deepStrictEqual(math.concat([[0, 1, 2]], [[1, 2, 3]]), [[ 0, 1, 2, 1, 2, 3 ]]);
381
- assert.deepStrictEqual(math.concat([[0, 1, 2]], [[1, 2, 3]], 0), [[ 0, 1, 2 ], [ 1, 2, 3 ]]);
417
+ assert.deepStrictEqual(math.concat([[0, 1, 2]], [[1, 2, 3]]), [
418
+ [0, 1, 2, 1, 2, 3],
419
+ ])
420
+ assert.deepStrictEqual(math.concat([[0, 1, 2]], [[1, 2, 3]], 0), [
421
+ [0, 1, 2],
422
+ [1, 2, 3],
423
+ ])
382
424
  }
383
425
 
384
426
  // Matrix is available as a constructor for instanceof checks
@@ -391,39 +433,50 @@ Matrices examples
391
433
  Sparse matrices examples
392
434
  */
393
435
  {
394
- const math = create(all, {});
436
+ const math = create(all, {})
395
437
 
396
438
  // create a sparse matrix
397
- const a = math.identity(1000, 1000, 'sparse');
439
+ const a = math.identity(1000, 1000, 'sparse')
398
440
 
399
441
  // do operations with a sparse matrix
400
- const b = math.multiply(a, a);
401
- const c = math.multiply(b, math.complex(2, 2));
402
- const d = math.matrix([0, 1]);
403
- const e = math.transpose(d);
404
- const f = math.multiply(e, d);
442
+ const b = math.multiply(a, a)
443
+ const _c = math.multiply(b, math.complex(2, 2))
444
+ const d = math.matrix([0, 1])
445
+ const e = math.transpose(d)
446
+ const _f = math.multiply(e, d)
405
447
  }
406
448
 
407
449
  /*
408
450
  Units examples
409
451
  */
410
452
  {
411
- const math = create(all, {});
453
+ const math = create(all, {})
412
454
 
413
455
  // units can be created by providing a value and unit name, or by providing
414
456
  // a string with a valued unit.
415
- const a = math.unit(45, 'cm'); // 450 mm
416
- const b = math.unit('0.1m'); // 100 mm
417
- const c = math.unit(b)
457
+ const a = math.unit(45, 'cm') // 450 mm
458
+ const b = math.unit('0.1m') // 100 mm
459
+ const _c = math.unit(b)
418
460
 
419
461
  // creating units
420
- math.createUnit('foo');
421
- math.createUnit('furlong', '220 yards');
422
- math.createUnit('furlong', '220 yards', { override: true });
423
- math.createUnit('testunit', { definition: '0.555556 kelvin', offset: 459.67 });
424
- math.createUnit('testunit', { definition: '0.555556 kelvin', offset: 459.67 }, { override: true });
425
- math.createUnit('knot', { definition: '0.514444 m/s', aliases: ['knots', 'kt', 'kts'] });
426
- math.createUnit('knot', { definition: '0.514444 m/s', aliases: ['knots', 'kt', 'kts'] }, { override: true });
462
+ math.createUnit('foo')
463
+ math.createUnit('furlong', '220 yards')
464
+ math.createUnit('furlong', '220 yards', { override: true })
465
+ math.createUnit('testunit', { definition: '0.555556 kelvin', offset: 459.67 })
466
+ math.createUnit(
467
+ 'testunit',
468
+ { definition: '0.555556 kelvin', offset: 459.67 },
469
+ { override: true }
470
+ )
471
+ math.createUnit('knot', {
472
+ definition: '0.514444 m/s',
473
+ aliases: ['knots', 'kt', 'kts'],
474
+ })
475
+ math.createUnit(
476
+ 'knot',
477
+ { definition: '0.514444 m/s', aliases: ['knots', 'kt', 'kts'] },
478
+ { override: true }
479
+ )
427
480
  math.createUnit(
428
481
  'knot',
429
482
  {
@@ -432,7 +485,7 @@ Units examples
432
485
  prefixes: 'long',
433
486
  },
434
487
  { override: true }
435
- );
488
+ )
436
489
  math.createUnit(
437
490
  {
438
491
  foo2: {
@@ -447,99 +500,381 @@ Units examples
447
500
  {
448
501
  override: true,
449
502
  }
450
- );
503
+ )
451
504
  // use Unit as definition
452
- math.createUnit('c', { definition: b });
453
- math.createUnit('c', { definition: b }, { override: true });
505
+ math.createUnit('c', { definition: b })
506
+ math.createUnit('c', { definition: b }, { override: true })
454
507
 
455
508
  // units can be added, subtracted, and multiplied or divided by numbers and by other units
456
- math.add(a, b);
457
- math.multiply(b, 2);
458
- math.divide(math.unit('1 m'), math.unit('1 s'));
459
- math.pow(math.unit('12 in'), 3);
509
+ math.add(a, b)
510
+ math.multiply(b, 2)
511
+ math.divide(math.unit('1 m'), math.unit('1 s'))
512
+ math.pow(math.unit('12 in'), 3)
460
513
 
461
514
  // units can be converted to a specific type, or to a number
462
- b.to('cm');
463
- math.to(b, 'inch');
464
- b.toNumber('cm');
465
- math.number(b, 'cm');
515
+ b.to('cm')
516
+ math.to(b, 'inch')
517
+ b.toNumber('cm')
518
+ math.number(b, 'cm')
466
519
 
467
520
  // the expression parser supports units too
468
- math.evaluate('2 inch to cm');
521
+ math.evaluate('2 inch to cm')
469
522
 
470
523
  // units can be converted to SI
471
- math.unit('1 inch').toSI();
524
+ math.unit('1 inch').toSI()
472
525
 
473
526
  // units can be split into other units
474
- math.unit('1 m').splitUnit(['ft', 'in']);
527
+ math.unit('1 m').splitUnit(['ft', 'in'])
475
528
  }
476
529
 
477
530
  /*
478
531
  Expression tree examples
479
532
  */
480
533
  {
481
- const math = create(all, {});
534
+ const math = create(all, {})
482
535
 
483
536
  // Filter an expression tree
484
- const node: math.MathNode = math.parse('x^2 + x/4 + 3*y');
485
- const filtered: math.MathNode[] = node.filter((node: math.MathNode) => node.type === 'SymbolNode' && node.name === 'x');
537
+ const node: math.MathNode = math.parse('x^2 + x/4 + 3*y')
538
+ const filtered: math.MathNode[] = node.filter(
539
+ (node: math.MathNode) => node.type === 'SymbolNode' && node.name === 'x'
540
+ )
486
541
 
487
- const arr: string[] = filtered.map((node: math.MathNode) => node.toString());
542
+ const _arr: string[] = filtered.map((node: math.MathNode) => node.toString())
488
543
 
489
544
  // Traverse an expression tree
490
- const node1: math.MathNode = math.parse('3 * x + 2');
491
- node1.traverse((node: math.MathNode, path: string, parent: math.MathNode) => {
492
- switch (node.type) {
493
- case 'OperatorNode':
494
- return node.type === 'OperatorNode';
495
- case 'ConstantNode':
496
- return node.type === 'ConstantNode';
497
- case 'SymbolNode':
498
- return node.type === 'SymbolNode';
499
- default:
500
- return;
545
+ const node1: math.MathNode = math.parse('3 * x + 2')
546
+ node1.traverse(
547
+ (node: math.MathNode, _path: string, _parent: math.MathNode) => {
548
+ switch (node.type) {
549
+ case 'OperatorNode':
550
+ return node.type === 'OperatorNode'
551
+ case 'ConstantNode':
552
+ return node.type === 'ConstantNode'
553
+ case 'SymbolNode':
554
+ return node.type === 'SymbolNode'
555
+ default:
556
+ return
557
+ }
501
558
  }
502
- });
559
+ )
560
+ }
561
+
562
+ /*
563
+ Function ceil examples
564
+ */
565
+ {
566
+ const math = create(all, {})
567
+
568
+ // number input
569
+ assert.strictEqual(math.ceil(3.2), 4)
570
+ assert.strictEqual(math.ceil(-4.2), -4)
571
+
572
+ // number input
573
+ // roundoff result to 2 decimals
574
+ assert.strictEqual(math.ceil(3.212, 2), 3.22)
575
+ assert.deepStrictEqual(
576
+ math.ceil(3.212, math.bignumber(2)),
577
+ math.bignumber(3.22)
578
+ )
579
+ assert.strictEqual(math.ceil(-4.212, 2), -4.21)
580
+
581
+ // bignumber input
582
+ assert.deepStrictEqual(math.ceil(math.bignumber(3.212)), math.bignumber(4))
583
+ assert.deepStrictEqual(
584
+ math.ceil(math.bignumber(3.212), 2),
585
+ math.bignumber(3.22)
586
+ )
587
+ assert.deepStrictEqual(
588
+ math.ceil(math.bignumber(3.212), math.bignumber(2)),
589
+ math.bignumber(3.22)
590
+ )
591
+
592
+ // fraction input
593
+ assert.deepStrictEqual(math.ceil(math.fraction(44, 7)), math.fraction(7))
594
+ assert.deepStrictEqual(math.ceil(math.fraction(-44, 7)), math.fraction(-6))
595
+ assert.deepStrictEqual(
596
+ math.ceil(math.fraction(44, 7), 2),
597
+ math.fraction(629, 100)
598
+ )
599
+ assert.deepStrictEqual(
600
+ math.ceil(math.fraction(44, 7), math.bignumber(2)),
601
+ math.fraction(629, 100)
602
+ )
603
+
604
+ // Complex input
605
+ const c = math.complex(3.24, -2.71)
606
+ assert.deepStrictEqual(math.ceil(c), math.complex(4, -2))
607
+ assert.deepStrictEqual(math.ceil(c, 1), math.complex(3.3, -2.7))
608
+ assert.deepStrictEqual(
609
+ math.ceil(c, math.bignumber(1)),
610
+ math.complex(3.3, -2.7)
611
+ )
612
+
613
+ // array input
614
+ assert.deepStrictEqual(math.ceil([3.2, 3.8, -4.7]), [4, 4, -4])
615
+ assert.deepStrictEqual(math.ceil([3.21, 3.82, -4.71], 1), [3.3, 3.9, -4.7])
616
+ assert.deepStrictEqual(
617
+ math.ceil([3.21, 3.82, -4.71], math.bignumber(1)),
618
+ math.bignumber([3.3, 3.9, -4.7])
619
+ )
620
+
621
+ // numeric input, array or matrix of decimals
622
+ const numCeiled: math.MathArray = math.ceil(math.tau, [2, 3])
623
+ assert.deepStrictEqual(numCeiled, [6.29, 6.284])
624
+ const bigCeiled: math.Matrix = math.ceil(
625
+ math.bignumber(6.28318),
626
+ math.matrix([2, 3])
627
+ )
628
+ assert.deepStrictEqual(bigCeiled, math.matrix(math.bignumber([6.29, 6.284])))
629
+ assert.deepStrictEqual(math.ceil(math.fraction(44, 7), [2, 3]), [
630
+ math.fraction(629, 100),
631
+ math.fraction(6286, 1000),
632
+ ])
633
+
634
+ // @ts-expect-error ... verify ceil(array, array) throws an error (for now)
635
+ assert.throws(() => math.ceil([3.21, 3.82], [1, 2]), TypeError)
636
+ }
637
+
638
+ /*
639
+ Function fix examples
640
+ */
641
+ {
642
+ const math = create(all, {})
643
+
644
+ // number input
645
+ assert.strictEqual(math.fix(3.2), 3)
646
+ assert.strictEqual(math.fix(-4.2), -4)
647
+
648
+ // number input
649
+ // roundoff result to 2 decimals
650
+ assert.strictEqual(math.fix(3.212, 2), 3.21)
651
+ assert.deepStrictEqual(
652
+ math.fix(3.212, math.bignumber(2)),
653
+ math.bignumber(3.21)
654
+ )
655
+ assert.strictEqual(math.fix(-4.212, 2), -4.21)
656
+
657
+ // bignumber input
658
+ assert.deepStrictEqual(math.fix(math.bignumber(3.212)), math.bignumber(3))
659
+ assert.deepStrictEqual(
660
+ math.fix(math.bignumber(3.212), 2),
661
+ math.bignumber(3.21)
662
+ )
663
+ assert.deepStrictEqual(
664
+ math.fix(math.bignumber(3.212), math.bignumber(2)),
665
+ math.bignumber(3.21)
666
+ )
667
+
668
+ // fraction input
669
+ assert.deepStrictEqual(math.fix(math.fraction(44, 7)), math.fraction(6))
670
+ assert.deepStrictEqual(math.fix(math.fraction(-44, 7)), math.fraction(-6))
671
+ assert.deepStrictEqual(
672
+ math.fix(math.fraction(44, 7), 2),
673
+ math.fraction(628, 100)
674
+ )
675
+ assert.deepStrictEqual(
676
+ math.fix(math.fraction(44, 7), math.bignumber(2)),
677
+ math.fraction(628, 100)
678
+ )
679
+
680
+ // Complex input
681
+ const c = math.complex(3.24, -2.71)
682
+ assert.deepStrictEqual(math.fix(c), math.complex(3, -2))
683
+ assert.deepStrictEqual(math.fix(c, 1), math.complex(3.2, -2.7))
684
+ assert.deepStrictEqual(
685
+ math.fix(c, math.bignumber(1)),
686
+ math.complex(3.2, -2.7)
687
+ )
688
+
689
+ // array input
690
+ assert.deepStrictEqual(math.fix([3.2, 3.8, -4.7]), [3, 3, -4])
691
+ assert.deepStrictEqual(math.fix([3.21, 3.82, -4.71], 1), [3.2, 3.8, -4.7])
692
+ assert.deepStrictEqual(
693
+ math.fix([3.21, 3.82, -4.71], math.bignumber(1)),
694
+ math.bignumber([3.2, 3.8, -4.7])
695
+ )
696
+
697
+ // numeric input, array or matrix of decimals
698
+ const numFixed: math.MathArray = math.fix(math.tau, [2, 3])
699
+ assert.deepStrictEqual(numFixed, [6.28, 6.283])
700
+ const bigFixed: math.Matrix = math.fix(
701
+ math.bignumber(6.28318),
702
+ math.matrix([2, 3])
703
+ )
704
+ assert.deepStrictEqual(bigFixed, math.matrix(math.bignumber([6.28, 6.283])))
705
+ assert.deepStrictEqual(math.fix(math.fraction(44, 7), [2, 3]), [
706
+ math.fraction(628, 100),
707
+ math.fraction(6285, 1000),
708
+ ])
709
+
710
+ // @ts-expect-error ... verify fix(array, array) throws an error (for now)
711
+ assert.throws(() => math.fix([3.21, 3.82], [1, 2]), TypeError)
503
712
  }
504
713
 
505
714
  /*
506
715
  Function floor examples
507
716
  */
508
717
  {
509
- const math = create(all, {});
718
+ const math = create(all, {})
510
719
 
511
720
  // number input
512
- assert.strictEqual(math.floor(3.2), 3);
513
- assert.strictEqual(math.floor(-4.2), -5);
721
+ assert.strictEqual(math.floor(3.2), 3)
722
+ assert.strictEqual(math.floor(-4.2), -5)
514
723
 
515
724
  // number input
516
725
  // roundoff result to 2 decimals
517
- assert.strictEqual(math.floor(3.212, 2), 3.21);
518
- assert.strictEqual(math.floor(-4.212, 2), -4.22);
726
+ assert.strictEqual(math.floor(3.212, 2), 3.21)
727
+ assert.deepStrictEqual(
728
+ math.floor(3.212, math.bignumber(2)),
729
+ math.bignumber(3.21)
730
+ )
731
+ assert.strictEqual(math.floor(-4.212, 2), -4.22)
732
+
733
+ // bignumber input
734
+ assert.deepStrictEqual(math.floor(math.bignumber(3.212)), math.bignumber(3))
735
+ assert.deepStrictEqual(
736
+ math.floor(math.bignumber(3.212), 2),
737
+ math.bignumber(3.21)
738
+ )
739
+ assert.deepStrictEqual(
740
+ math.floor(math.bignumber(3.212), math.bignumber(2)),
741
+ math.bignumber(3.21)
742
+ )
743
+
744
+ // fraction input
745
+ assert.deepStrictEqual(math.floor(math.fraction(44, 7)), math.fraction(6))
746
+ assert.deepStrictEqual(math.floor(math.fraction(-44, 7)), math.fraction(-7))
747
+ assert.deepStrictEqual(
748
+ math.floor(math.fraction(44, 7), 2),
749
+ math.fraction(628, 100)
750
+ )
751
+ assert.deepStrictEqual(
752
+ math.floor(math.fraction(44, 7), math.bignumber(2)),
753
+ math.fraction(628, 100)
754
+ )
519
755
 
520
756
  // Complex input
521
- const c = math.complex(3.24, -2.71);
522
- assert.deepStrictEqual(math.floor(c), math.complex(3, -3));
523
- assert.deepStrictEqual(math.floor(c, 1), math.complex(3.2, -2.8));
757
+ const c = math.complex(3.24, -2.71)
758
+ assert.deepStrictEqual(math.floor(c), math.complex(3, -3))
759
+ assert.deepStrictEqual(math.floor(c, 1), math.complex(3.2, -2.8))
760
+ assert.deepStrictEqual(
761
+ math.floor(c, math.bignumber(1)),
762
+ math.complex(3.2, -2.8)
763
+ )
524
764
 
525
- //array input
526
- assert.deepStrictEqual(math.floor([3.2, 3.8, -4.7]), [3, 3, -5]);
527
- assert.deepStrictEqual(math.floor([3.21, 3.82, -4.71], 1), [3.2, 3.8, -4.8]);
765
+ // array input
766
+ assert.deepStrictEqual(math.floor([3.2, 3.8, -4.7]), [3, 3, -5])
767
+ assert.deepStrictEqual(math.floor([3.21, 3.82, -4.71], 1), [3.2, 3.8, -4.8])
768
+ assert.deepStrictEqual(
769
+ math.floor([3.21, 3.82, -4.71], math.bignumber(1)),
770
+ math.bignumber([3.2, 3.8, -4.8])
771
+ )
772
+
773
+ // numeric input, array or matrix of decimals
774
+ const numFloored: math.MathArray = math.floor(math.tau, [2, 3])
775
+ assert.deepStrictEqual(numFloored, [6.28, 6.283])
776
+ const bigFloored: math.Matrix = math.floor(
777
+ math.bignumber(6.28318),
778
+ math.matrix([2, 3])
779
+ )
780
+ assert.deepStrictEqual(bigFloored, math.matrix(math.bignumber([6.28, 6.283])))
781
+ assert.deepStrictEqual(math.floor(math.fraction(44, 7), [2, 3]), [
782
+ math.fraction(628, 100),
783
+ math.fraction(6285, 1000),
784
+ ])
785
+
786
+ // @ts-expect-error ... verify floor(array, array) throws an error (for now)
787
+ assert.throws(() => math.floor([3.21, 3.82], [1, 2]), TypeError)
528
788
  }
529
789
 
790
+ /*
791
+ Function round examples
792
+ */
793
+ {
794
+ const math = create(all, {})
795
+
796
+ // number input
797
+ assert.strictEqual(math.round(3.2), 3)
798
+ assert.strictEqual(math.round(-4.2), -4)
799
+
800
+ // number input
801
+ // roundoff result to 2 decimals
802
+ assert.strictEqual(math.round(3.212, 2), 3.21)
803
+ assert.deepStrictEqual(
804
+ math.round(3.212, math.bignumber(2)),
805
+ math.bignumber(3.21)
806
+ )
807
+ assert.strictEqual(math.round(-4.212, 2), -4.21)
808
+
809
+ // bignumber input
810
+ assert.deepStrictEqual(math.round(math.bignumber(3.212)), math.bignumber(3))
811
+ assert.deepStrictEqual(
812
+ math.round(math.bignumber(3.212), 2),
813
+ math.bignumber(3.21)
814
+ )
815
+ assert.deepStrictEqual(
816
+ math.round(math.bignumber(3.212), math.bignumber(2)),
817
+ math.bignumber(3.21)
818
+ )
819
+
820
+ // fraction input
821
+ assert.deepStrictEqual(math.round(math.fraction(44, 7)), math.fraction(6))
822
+ assert.deepStrictEqual(math.round(math.fraction(-44, 7)), math.fraction(-6))
823
+ assert.deepStrictEqual(
824
+ math.round(math.fraction(44, 7), 2),
825
+ math.fraction(629, 100)
826
+ )
827
+ assert.deepStrictEqual(
828
+ math.round(math.fraction(44, 7), math.bignumber(2)),
829
+ math.fraction(629, 100)
830
+ )
831
+
832
+ // Complex input
833
+ const c = math.complex(3.24, -2.71)
834
+ assert.deepStrictEqual(math.round(c), math.complex(3, -3))
835
+ assert.deepStrictEqual(math.round(c, 1), math.complex(3.2, -2.7))
836
+ assert.deepStrictEqual(
837
+ math.round(c, math.bignumber(1)),
838
+ math.complex(3.2, -2.7)
839
+ )
840
+
841
+ // array input
842
+ assert.deepStrictEqual(math.round([3.2, 3.8, -4.7]), [3, 4, -5])
843
+ assert.deepStrictEqual(math.round([3.21, 3.82, -4.71], 1), [3.2, 3.8, -4.7])
844
+ assert.deepStrictEqual(
845
+ math.round([3.21, 3.82, -4.71], math.bignumber(1)),
846
+ math.bignumber([3.2, 3.8, -4.7])
847
+ )
848
+
849
+ // numeric input, array or matrix of decimals
850
+ const numRounded: math.MathArray = math.round(math.tau, [2, 3])
851
+ assert.deepStrictEqual(numRounded, [6.28, 6.283])
852
+ const bigRounded: math.Matrix = math.round(
853
+ math.bignumber(6.28318),
854
+ math.matrix([2, 3])
855
+ )
856
+ assert.deepStrictEqual(bigRounded, math.matrix(math.bignumber([6.28, 6.283])))
857
+ assert.deepStrictEqual(math.round(math.fraction(44, 7), [2, 3]), [
858
+ math.fraction(629, 100),
859
+ math.fraction(6286, 1000),
860
+ ])
861
+
862
+ // @ts-expect-error ... verify round(array, array) throws an error (for now)
863
+ assert.throws(() => math.round([3.21, 3.82], [1, 2]), TypeError)
864
+ }
530
865
 
531
866
  /*
532
867
  JSON serialization/deserialization
533
868
  */
534
869
  {
535
- const math = create(all, {});
870
+ const math = create(all, {})
536
871
 
537
872
  const data = {
538
873
  bigNumber: math.bignumber('1.5'),
539
- };
540
- const stringified = JSON.stringify(data);
541
- const parsed = JSON.parse(stringified, math.reviver);
542
- assert.deepStrictEqual(parsed.bigNumber, math.bignumber('1.5'));
874
+ }
875
+ const stringified = JSON.stringify(data)
876
+ const parsed = JSON.parse(stringified, math.reviver)
877
+ assert.deepStrictEqual(parsed.bigNumber, math.bignumber('1.5'))
543
878
  }
544
879
 
545
880
  /*
@@ -548,14 +883,14 @@ Extend functionality with import
548
883
 
549
884
  declare module 'mathjs' {
550
885
  interface MathJsStatic {
551
- testFun(): number;
552
- value: number;
886
+ testFun(): number
887
+ value: number
553
888
  }
554
889
  }
555
890
 
556
891
  {
557
- const math = create(all, {});
558
- const testFun = () => 5;
892
+ const math = create(all, {})
893
+ const testFun = () => 5
559
894
 
560
895
  math.import(
561
896
  {
@@ -563,26 +898,84 @@ declare module 'mathjs' {
563
898
  value: 10,
564
899
  },
565
900
  {}
566
- );
901
+ )
902
+
903
+ math.testFun()
567
904
 
568
- math.testFun();
905
+ expectTypeOf(math.testFun()).toMatchTypeOf<number>()
906
+
907
+ expectTypeOf(
908
+ math.import({
909
+ myvalue: 42,
910
+ myFunc: (name: string) => `myFunc ${name}`,
911
+ })
912
+ ).toMatchTypeOf<void>()
913
+
914
+ expectTypeOf(
915
+ math.import(
916
+ {
917
+ myvalue: 42,
918
+ myFunc: (name: string) => `myFunc ${name}`,
919
+ },
920
+ {
921
+ override: true,
922
+ }
923
+ )
924
+ ).toMatchTypeOf<void>()
569
925
 
570
- const a = math.value * 2;
926
+ expectTypeOf(
927
+ math.import(
928
+ {
929
+ myvalue2: 42,
930
+ },
931
+ {
932
+ silent: true,
933
+ }
934
+ )
935
+ ).toMatchTypeOf<void>()
936
+
937
+ expectTypeOf(
938
+ math.import(
939
+ {
940
+ myvalue3: 42,
941
+ },
942
+ {
943
+ wrap: true,
944
+ }
945
+ )
946
+ ).toMatchTypeOf<void>()
947
+
948
+ expectTypeOf(
949
+ math.import({
950
+ myvalue4: 42,
951
+ })
952
+ ).toMatchTypeOf<void>()
953
+
954
+ expectTypeOf(
955
+ math.import([
956
+ {
957
+ myvalue5: 42,
958
+ },
959
+ {
960
+ myFunc2: (name: string) => `myFunc2 ${name}`,
961
+ },
962
+ ])
963
+ ).toMatchTypeOf<void>()
571
964
  }
572
965
 
573
966
  /*
574
967
  Renamed functions from v5 => v6
575
968
  */
576
969
  {
577
- const math = create(all, {});
578
- math.typeOf(1);
579
- math.variance([1, 2, 3, 4]);
580
- math.evaluate('1 + 2');
970
+ const math = create(all, {})
971
+ math.typeOf(1)
972
+ math.variance([1, 2, 3, 4])
973
+ math.evaluate('1 + 2')
581
974
 
582
975
  // chained operations
583
- math.chain(3).typeOf().done();
584
- math.chain([1, 2, 3]).variance().done();
585
- math.chain('1 + 2').evaluate().done();
976
+ math.chain(3).typeOf().done()
977
+ math.chain([1, 2, 3]).variance().done()
978
+ math.chain('1 + 2').evaluate().done()
586
979
  }
587
980
 
588
981
  /*
@@ -590,20 +983,20 @@ Factory Test
590
983
  */
591
984
  {
592
985
  // create a factory function
593
- const name = 'negativeSquare';
594
- const dependencies: MathJsFunctionName[] = ['multiply', 'unaryMinus'];
986
+ const name = 'negativeSquare'
987
+ const dependencies: MathJsFunctionName[] = ['multiply', 'unaryMinus']
595
988
  const createNegativeSquare = factory(name, dependencies, (injected) => {
596
- const { multiply, unaryMinus } = injected;
989
+ const { multiply, unaryMinus } = injected
597
990
  return function negativeSquare(x: number): number {
598
- return unaryMinus(multiply(x, x));
599
- };
600
- });
991
+ return unaryMinus(multiply(x, x))
992
+ }
993
+ })
601
994
 
602
995
  // create an instance of the function yourself:
603
- const multiply = (a: number, b: number) => a * b;
604
- const unaryMinus = (a: number) => -a;
605
- const negativeSquare = createNegativeSquare({ multiply, unaryMinus });
606
- negativeSquare(3);
996
+ const multiply = (a: number, b: number) => a * b
997
+ const unaryMinus = (a: number) => -a
998
+ const negativeSquare = createNegativeSquare({ multiply, unaryMinus })
999
+ negativeSquare(3)
607
1000
  }
608
1001
 
609
1002
  /**
@@ -613,7 +1006,7 @@ Factory Test
613
1006
  {
614
1007
  const config = {
615
1008
  // optionally, you can specify configuration
616
- };
1009
+ }
617
1010
 
618
1011
  // Create just the functions we need
619
1012
  const { fraction, add, divide, format } = create(
@@ -624,15 +1017,15 @@ Factory Test
624
1017
  formatDependencies,
625
1018
  },
626
1019
  config
627
- );
1020
+ )
628
1021
 
629
1022
  // Use the created functions
630
- const a = fraction(1, 3);
631
- const b = fraction(3, 7);
632
- const c = add(a, b);
633
- const d = divide(a, b);
634
- assert.strictEqual(format(c), "16/21");
635
- assert.strictEqual(format(d), "7/9");
1023
+ const a = fraction(1, 3)
1024
+ const b = fraction(3, 7)
1025
+ const c = add(a, b)
1026
+ const d = divide(a, b)
1027
+ assert.strictEqual(format(c), '16/21')
1028
+ assert.strictEqual(format(d), '7/9')
636
1029
  }
637
1030
 
638
1031
  /**
@@ -640,15 +1033,15 @@ Factory Test
640
1033
  * https://mathjs.org/docs/expressions/customization.html#customize-supported-characters
641
1034
  */
642
1035
  {
643
- const math = create(all, {});
644
- const isAlphaOriginal = math.parse.isAlpha;
1036
+ const math = create(all, {})
1037
+ const isAlphaOriginal = math.parse.isAlpha
645
1038
  math.parse.isAlpha = (c, cPrev, cNext) => {
646
- return isAlphaOriginal(c, cPrev, cNext) || c === "\u260E";
647
- };
1039
+ return isAlphaOriginal(c, cPrev, cNext) || c === '\u260E'
1040
+ }
648
1041
 
649
1042
  // now we can use the \u260E (phone) character in expressions
650
- const result = math.evaluate("\u260Efoo", { "\u260Efoo": 42 });
651
- assert.strictEqual(result, 42);
1043
+ const result = math.evaluate('\u260Efoo', { '\u260Efoo': 42 })
1044
+ assert.strictEqual(result, 42)
652
1045
  }
653
1046
 
654
1047
  /**
@@ -656,26 +1049,30 @@ Factory Test
656
1049
  * https://mathjs.org/docs/reference/functions.html#utils-functions
657
1050
  */
658
1051
  {
659
- const math = create(all, {});
1052
+ const math = create(all, {})
660
1053
 
661
1054
  // hasNumericValue function
662
- assert. strictEqual(math.hasNumericValue(2), true);
663
- assert. strictEqual(math.hasNumericValue('2'), true);
664
- assert. strictEqual(math.isNumeric('2'), false);
665
- assert. strictEqual(math.hasNumericValue(0), true);
666
- assert. strictEqual(math.hasNumericValue(math.bignumber(500)), true);
667
- assert.deepStrictEqual(math.hasNumericValue([2.3, 'foo', false]), [true, false, true]);
668
- assert. strictEqual(math.hasNumericValue(math.fraction(4)), true);
669
- assert. strictEqual(math.hasNumericValue(math.complex('2-4i')), false);
1055
+ assert.strictEqual(math.hasNumericValue(2), true)
1056
+ assert.strictEqual(math.hasNumericValue('2'), true)
1057
+ assert.strictEqual(math.isNumeric('2'), false)
1058
+ assert.strictEqual(math.hasNumericValue(0), true)
1059
+ assert.strictEqual(math.hasNumericValue(math.bignumber(500)), true)
1060
+ assert.deepStrictEqual(math.hasNumericValue([2.3, 'foo', false]), [
1061
+ true,
1062
+ false,
1063
+ true,
1064
+ ])
1065
+ assert.strictEqual(math.hasNumericValue(math.fraction(4)), true)
1066
+ assert.strictEqual(math.hasNumericValue(math.complex('2-4i')), false)
670
1067
  }
671
1068
 
672
1069
  /**
673
1070
  * src/util/is functions
674
1071
  */
675
1072
  {
676
- const math = create(all, {});
1073
+ const math = create(all, {})
677
1074
 
678
- type IsFunc = (x: unknown) => boolean;
1075
+ type IsFunc = (x: unknown) => boolean
679
1076
  const isFuncs: IsFunc[] = [
680
1077
  math.isNumber,
681
1078
  math.isBigNumber,
@@ -714,13 +1111,13 @@ Factory Test
714
1111
  math.isParenthesisNode,
715
1112
  math.isRangeNode,
716
1113
  math.isSymbolNode,
717
- math.isChain
1114
+ math.isChain,
718
1115
  ]
719
1116
 
720
- isFuncs.forEach(f => {
721
- const result = f(1);
722
- const isResultBoolean = result === true || result === false;
723
- assert.ok(isResultBoolean);
1117
+ isFuncs.forEach((f) => {
1118
+ const result = f(1)
1119
+ const isResultBoolean = result === true || result === false
1120
+ assert.ok(isResultBoolean)
724
1121
  })
725
1122
 
726
1123
  // Check guards do type refinement
@@ -836,8 +1233,42 @@ Factory Test
836
1233
  Probability function examples
837
1234
  */
838
1235
  {
839
- const math = create(all, {});
1236
+ const math = create(all, {})
840
1237
 
841
1238
  expectTypeOf(math.lgamma(1.5)).toMatchTypeOf<number>()
842
- expectTypeOf(math.lgamma(math.complex(1.5, -1.5))).toMatchTypeOf<math.Complex>()
1239
+ expectTypeOf(
1240
+ math.lgamma(math.complex(1.5, -1.5))
1241
+ ).toMatchTypeOf<math.Complex>()
1242
+ }
1243
+
1244
+ /*
1245
+ toTex examples
1246
+ */
1247
+
1248
+ {
1249
+ const math = create(all, {})
1250
+
1251
+ expectTypeOf(math.parse('a/b').toTex()).toMatchTypeOf<string>()
1252
+
1253
+ // TODO add proper types for toTex options
1254
+ expectTypeOf(
1255
+ math.parse('a/b').toTex({
1256
+ a: '123',
1257
+ })
1258
+ ).toMatchTypeOf<string>()
1259
+ }
1260
+
1261
+ /*
1262
+ Resolve examples
1263
+ */
1264
+ {
1265
+ const math = create(all, {})
1266
+
1267
+ expectTypeOf(math.resolve(math.parse('x + y'))).toMatchTypeOf<MathNode>()
1268
+ expectTypeOf(
1269
+ math.resolve(math.parse('x + y'), { x: 0 })
1270
+ ).toMatchTypeOf<MathNode>()
1271
+ expectTypeOf(math.resolve([math.parse('x + y')], { x: 0 })).toMatchTypeOf<
1272
+ MathNode[]
1273
+ >()
843
1274
  }