mathjs 7.2.0 → 7.5.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.
Files changed (159) hide show
  1. package/HISTORY.md +34 -0
  2. package/dist/math.js +3421 -2476
  3. package/dist/math.min.js +5 -5
  4. package/dist/math.min.map +1 -1
  5. package/docs/expressions/syntax.md +30 -4
  6. package/docs/reference/functions/bin.md +38 -0
  7. package/docs/reference/functions/ceil.md +10 -1
  8. package/docs/reference/functions/fix.md +10 -2
  9. package/docs/reference/functions/floor.md +12 -3
  10. package/docs/reference/functions/hex.md +38 -0
  11. package/docs/reference/functions/lsolve.md +2 -1
  12. package/docs/reference/functions/lsolveAll.md +45 -0
  13. package/docs/reference/functions/oct.md +38 -0
  14. package/docs/reference/functions/rotationMatrix.md +51 -0
  15. package/docs/reference/functions/round.md +6 -2
  16. package/docs/reference/functions/usolve.md +2 -1
  17. package/docs/reference/functions/usolveAll.md +45 -0
  18. package/docs/reference/functions.md +8 -2
  19. package/es/entry/dependenciesAny/dependenciesBin.generated.js +10 -0
  20. package/es/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
  21. package/es/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
  22. package/es/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
  23. package/es/entry/dependenciesAny/dependenciesHex.generated.js +10 -0
  24. package/es/entry/dependenciesAny/dependenciesLsolveAll.generated.js +22 -0
  25. package/es/entry/dependenciesAny/dependenciesOct.generated.js +10 -0
  26. package/es/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +30 -0
  27. package/es/entry/dependenciesAny/dependenciesUsolveAll.generated.js +22 -0
  28. package/es/entry/dependenciesAny.generated.js +6 -0
  29. package/es/entry/impureFunctionsAny.generated.js +63 -57
  30. package/es/entry/pureFunctionsAny.generated.js +323 -277
  31. package/es/expression/embeddedDocs/embeddedDocs.js +12 -0
  32. package/es/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
  33. package/es/expression/embeddedDocs/function/algebra/lsolveAll.js +8 -0
  34. package/es/expression/embeddedDocs/function/algebra/usolve.js +2 -2
  35. package/es/expression/embeddedDocs/function/algebra/usolveAll.js +8 -0
  36. package/es/expression/embeddedDocs/function/matrix/rotationMatrix.js +8 -0
  37. package/es/expression/embeddedDocs/function/utils/bin.js +8 -0
  38. package/es/expression/embeddedDocs/function/utils/hex.js +8 -0
  39. package/es/expression/embeddedDocs/function/utils/oct.js +8 -0
  40. package/es/expression/parse.js +28 -1
  41. package/es/factoriesAny.js +6 -0
  42. package/es/function/algebra/solver/lsolve.js +42 -69
  43. package/es/function/algebra/solver/lsolveAll.js +213 -0
  44. package/es/function/algebra/solver/lusolve.js +12 -27
  45. package/es/function/algebra/solver/usolve.js +41 -64
  46. package/es/function/algebra/solver/usolveAll.js +213 -0
  47. package/es/function/algebra/solver/utils/solveValidation.js +66 -107
  48. package/es/function/arithmetic/ceil.js +88 -4
  49. package/es/function/arithmetic/fix.js +43 -6
  50. package/es/function/arithmetic/floor.js +90 -6
  51. package/es/function/arithmetic/mod.js +10 -1
  52. package/es/function/arithmetic/round.js +6 -2
  53. package/es/function/matrix/rotationMatrix.js +175 -0
  54. package/es/function/matrix/sqrtm.js +4 -0
  55. package/es/function/probability/pickRandom.js +2 -6
  56. package/es/function/statistics/variance.js +4 -4
  57. package/es/function/string/baseUtils.js +36 -0
  58. package/es/function/string/bin.js +23 -0
  59. package/es/function/string/hex.js +23 -0
  60. package/es/function/string/oct.js +23 -0
  61. package/es/type/bignumber/BigNumber.js +4 -1
  62. package/es/type/number.js +10 -0
  63. package/es/utils/object.js +3 -1
  64. package/es/version.js +1 -1
  65. package/examples/advanced/web_server/math_worker.js +1 -1
  66. package/lib/entry/dependenciesAny/dependenciesBin.generated.js +20 -0
  67. package/lib/entry/dependenciesAny/dependenciesCeil.generated.js +6 -0
  68. package/lib/entry/dependenciesAny/dependenciesFix.generated.js +3 -0
  69. package/lib/entry/dependenciesAny/dependenciesFloor.generated.js +6 -0
  70. package/lib/entry/dependenciesAny/dependenciesHex.generated.js +20 -0
  71. package/lib/entry/dependenciesAny/dependenciesLsolveAll.generated.js +38 -0
  72. package/lib/entry/dependenciesAny/dependenciesOct.generated.js +20 -0
  73. package/lib/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +50 -0
  74. package/lib/entry/dependenciesAny/dependenciesUsolveAll.generated.js +38 -0
  75. package/lib/entry/dependenciesAny.generated.js +48 -0
  76. package/lib/entry/impureFunctionsAny.generated.js +65 -59
  77. package/lib/entry/pureFunctionsAny.generated.js +373 -321
  78. package/lib/expression/embeddedDocs/embeddedDocs.js +18 -0
  79. package/lib/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
  80. package/lib/expression/embeddedDocs/function/algebra/lsolveAll.js +15 -0
  81. package/lib/expression/embeddedDocs/function/algebra/usolve.js +2 -2
  82. package/lib/expression/embeddedDocs/function/algebra/usolveAll.js +15 -0
  83. package/lib/expression/embeddedDocs/function/matrix/rotationMatrix.js +15 -0
  84. package/lib/expression/embeddedDocs/function/utils/bin.js +15 -0
  85. package/lib/expression/embeddedDocs/function/utils/hex.js +15 -0
  86. package/lib/expression/embeddedDocs/function/utils/oct.js +15 -0
  87. package/lib/expression/parse.js +28 -1
  88. package/lib/factoriesAny.js +48 -0
  89. package/lib/function/algebra/solver/lsolve.js +42 -69
  90. package/lib/function/algebra/solver/lsolveAll.js +223 -0
  91. package/lib/function/algebra/solver/lusolve.js +12 -27
  92. package/lib/function/algebra/solver/usolve.js +41 -64
  93. package/lib/function/algebra/solver/usolveAll.js +223 -0
  94. package/lib/function/algebra/solver/utils/solveValidation.js +65 -106
  95. package/lib/function/arithmetic/ceil.js +91 -4
  96. package/lib/function/arithmetic/fix.js +44 -6
  97. package/lib/function/arithmetic/floor.js +93 -6
  98. package/lib/function/arithmetic/mod.js +10 -1
  99. package/lib/function/arithmetic/round.js +6 -2
  100. package/lib/function/matrix/rotationMatrix.js +185 -0
  101. package/lib/function/matrix/sqrtm.js +4 -0
  102. package/lib/function/probability/pickRandom.js +3 -7
  103. package/lib/function/statistics/variance.js +4 -4
  104. package/lib/function/string/baseUtils.js +45 -0
  105. package/lib/function/string/bin.js +31 -0
  106. package/lib/function/string/hex.js +31 -0
  107. package/lib/function/string/oct.js +31 -0
  108. package/lib/header.js +2 -2
  109. package/lib/type/bignumber/BigNumber.js +3 -1
  110. package/lib/type/number.js +10 -0
  111. package/lib/utils/object.js +3 -1
  112. package/lib/version.js +1 -1
  113. package/package.json +12 -12
  114. package/src/entry/dependenciesAny/dependenciesBin.generated.js +11 -0
  115. package/src/entry/dependenciesAny/dependenciesCeil.generated.js +4 -0
  116. package/src/entry/dependenciesAny/dependenciesFix.generated.js +2 -0
  117. package/src/entry/dependenciesAny/dependenciesFloor.generated.js +4 -0
  118. package/src/entry/dependenciesAny/dependenciesHex.generated.js +11 -0
  119. package/src/entry/dependenciesAny/dependenciesLsolveAll.generated.js +23 -0
  120. package/src/entry/dependenciesAny/dependenciesOct.generated.js +11 -0
  121. package/src/entry/dependenciesAny/dependenciesRotationMatrix.generated.js +31 -0
  122. package/src/entry/dependenciesAny/dependenciesUsolveAll.generated.js +23 -0
  123. package/src/entry/dependenciesAny.generated.js +6 -0
  124. package/src/entry/impureFunctionsAny.generated.js +104 -92
  125. package/src/entry/pureFunctionsAny.generated.js +94 -82
  126. package/src/expression/embeddedDocs/embeddedDocs.js +12 -0
  127. package/src/expression/embeddedDocs/function/algebra/lsolve.js +2 -2
  128. package/src/expression/embeddedDocs/function/algebra/lsolveAll.js +17 -0
  129. package/src/expression/embeddedDocs/function/algebra/usolve.js +2 -2
  130. package/src/expression/embeddedDocs/function/algebra/usolveAll.js +15 -0
  131. package/src/expression/embeddedDocs/function/matrix/rotationMatrix.js +19 -0
  132. package/src/expression/embeddedDocs/function/utils/bin.js +12 -0
  133. package/src/expression/embeddedDocs/function/utils/hex.js +12 -0
  134. package/src/expression/embeddedDocs/function/utils/oct.js +12 -0
  135. package/src/expression/parse.js +25 -0
  136. package/src/factoriesAny.js +6 -0
  137. package/src/function/algebra/solver/lsolve.js +52 -58
  138. package/src/function/algebra/solver/lsolveAll.js +197 -0
  139. package/src/function/algebra/solver/lusolve.js +9 -19
  140. package/src/function/algebra/solver/usolve.js +52 -55
  141. package/src/function/algebra/solver/usolveAll.js +199 -0
  142. package/src/function/algebra/solver/utils/solveValidation.js +78 -86
  143. package/src/function/arithmetic/ceil.js +63 -3
  144. package/src/function/arithmetic/fix.js +45 -6
  145. package/src/function/arithmetic/floor.js +65 -5
  146. package/src/function/arithmetic/mod.js +8 -1
  147. package/src/function/arithmetic/round.js +6 -2
  148. package/src/function/matrix/rotationMatrix.js +185 -0
  149. package/src/function/matrix/sqrtm.js +4 -0
  150. package/src/function/probability/pickRandom.js +2 -6
  151. package/src/function/statistics/variance.js +4 -4
  152. package/src/function/string/baseUtils.js +29 -0
  153. package/src/function/string/bin.js +23 -0
  154. package/src/function/string/hex.js +23 -0
  155. package/src/function/string/oct.js +24 -0
  156. package/src/type/bignumber/BigNumber.js +2 -1
  157. package/src/type/number.js +9 -1
  158. package/src/utils/object.js +3 -1
  159. package/src/version.js +1 -1
@@ -1,4 +1,4 @@
1
- import { isArray, isDenseMatrix, isMatrix } from '../../../../utils/is'
1
+ import { isArray, isMatrix, isDenseMatrix, isSparseMatrix } from '../../../../utils/is'
2
2
  import { arraySize } from '../../../../utils/array'
3
3
  import { format } from '../../../../utils/string'
4
4
 
@@ -13,131 +13,123 @@ export function createSolveValidation ({ DenseMatrix }) {
13
13
  * @return {DenseMatrix} Dense column vector b
14
14
  */
15
15
  return function solveValidation (m, b, copy) {
16
- // matrix size
17
- const size = m.size()
18
- // validate matrix dimensions
19
- if (size.length !== 2) { throw new RangeError('Matrix must be two dimensional (size: ' + format(size) + ')') }
20
- // rows & columns
21
- const rows = size[0]
22
- const columns = size[1]
23
- // validate rows & columns
24
- if (rows !== columns) { throw new RangeError('Matrix must be square (size: ' + format(size) + ')') }
25
- // vars
26
- let data, i, bdata
27
- // check b is matrix
16
+ const mSize = m.size()
17
+
18
+ if (mSize.length !== 2) {
19
+ throw new RangeError('Matrix must be two dimensional (size: ' + format(mSize) + ')')
20
+ }
21
+
22
+ const rows = mSize[0]
23
+ const columns = mSize[1]
24
+
25
+ if (rows !== columns) {
26
+ throw new RangeError('Matrix must be square (size: ' + format(mSize) + ')')
27
+ }
28
+
29
+ let data = []
30
+
28
31
  if (isMatrix(b)) {
29
- // matrix size
30
- const msize = b.size()
31
- // vector
32
- if (msize.length === 1) {
33
- // check vector length
34
- if (msize[0] !== rows) { throw new RangeError('Dimension mismatch. Matrix columns must match vector length.') }
35
- // create data array
36
- data = []
37
- // matrix data (DenseMatrix)
38
- bdata = b._data
39
- // loop b data
40
- for (i = 0; i < rows; i++) {
41
- // row array
32
+ const bSize = b.size()
33
+ const bdata = b._data
34
+
35
+ // 1-dim vector
36
+ if (bSize.length === 1) {
37
+ if (bSize[0] !== rows) {
38
+ throw new RangeError('Dimension mismatch. Matrix columns must match vector length.')
39
+ }
40
+
41
+ for (let i = 0; i < rows; i++) {
42
42
  data[i] = [bdata[i]]
43
43
  }
44
- // return Dense Matrix
44
+
45
45
  return new DenseMatrix({
46
46
  data: data,
47
47
  size: [rows, 1],
48
48
  datatype: b._datatype
49
49
  })
50
50
  }
51
- // two dimensions
52
- if (msize.length === 2) {
53
- // array must be a column vector
54
- if (msize[0] !== rows || msize[1] !== 1) { throw new RangeError('Dimension mismatch. Matrix columns must match vector length.') }
55
- // check matrix type
51
+
52
+ // 2-dim column
53
+ if (bSize.length === 2) {
54
+ if (bSize[0] !== rows || bSize[1] !== 1) {
55
+ throw new RangeError('Dimension mismatch. Matrix columns must match vector length.')
56
+ }
57
+
56
58
  if (isDenseMatrix(b)) {
57
- // check a copy is needed
58
59
  if (copy) {
59
- // create data array
60
60
  data = []
61
- // matrix data (DenseMatrix)
62
- bdata = b._data
63
- // loop b data
64
- for (i = 0; i < rows; i++) {
65
- // row array
61
+
62
+ for (let i = 0; i < rows; i++) {
66
63
  data[i] = [bdata[i][0]]
67
64
  }
68
- // return Dense Matrix
65
+
69
66
  return new DenseMatrix({
70
67
  data: data,
71
68
  size: [rows, 1],
72
69
  datatype: b._datatype
73
70
  })
74
71
  }
75
- // b is already a column vector
72
+
76
73
  return b
77
74
  }
78
- // create data array
79
- data = []
80
- for (i = 0; i < rows; i++) { data[i] = [0] }
81
- // sparse matrix arrays
82
- const values = b._values
83
- const index = b._index
84
- const ptr = b._ptr
85
- // loop values in column 0
86
- for (let k1 = ptr[1], k = ptr[0]; k < k1; k++) {
87
- // row
88
- i = index[k]
89
- // add to data
90
- data[i][0] = values[k]
75
+
76
+ if (isSparseMatrix(b)) {
77
+ for (let i = 0; i < rows; i++) { data[i] = [0] }
78
+
79
+ const values = b._values
80
+ const index = b._index
81
+ const ptr = b._ptr
82
+
83
+ for (let k1 = ptr[1], k = ptr[0]; k < k1; k++) {
84
+ const i = index[k]
85
+ data[i][0] = values[k]
86
+ }
87
+
88
+ return new DenseMatrix({
89
+ data: data,
90
+ size: [rows, 1],
91
+ datatype: b._datatype
92
+ })
91
93
  }
92
- // return Dense Matrix
93
- return new DenseMatrix({
94
- data: data,
95
- size: [rows, 1],
96
- datatype: b._datatype
97
- })
98
94
  }
99
- // throw error
100
- throw new RangeError('Dimension mismatch. Matrix columns must match vector length.')
95
+
96
+ throw new RangeError('Dimension mismatch. The right side has to be either 1- or 2-dimensional vector.')
101
97
  }
102
- // check b is array
98
+
103
99
  if (isArray(b)) {
104
- // size
105
- const asize = arraySize(b)
106
- // check matrix dimensions, vector
107
- if (asize.length === 1) {
108
- // check vector length
109
- if (asize[0] !== rows) { throw new RangeError('Dimension mismatch. Matrix columns must match vector length.') }
110
- // create data array
111
- data = []
112
- // loop b
113
- for (i = 0; i < rows; i++) {
114
- // row array
100
+ const bsize = arraySize(b)
101
+
102
+ if (bsize.length === 1) {
103
+ if (bsize[0] !== rows) {
104
+ throw new RangeError('Dimension mismatch. Matrix columns must match vector length.')
105
+ }
106
+
107
+ for (let i = 0; i < rows; i++) {
115
108
  data[i] = [b[i]]
116
109
  }
117
- // return Dense Matrix
110
+
118
111
  return new DenseMatrix({
119
112
  data: data,
120
113
  size: [rows, 1]
121
114
  })
122
115
  }
123
- if (asize.length === 2) {
124
- // array must be a column vector
125
- if (asize[0] !== rows || asize[1] !== 1) { throw new RangeError('Dimension mismatch. Matrix columns must match vector length.') }
126
- // create data array
127
- data = []
128
- // loop b data
129
- for (i = 0; i < rows; i++) {
130
- // row array
116
+
117
+ if (bsize.length === 2) {
118
+ if (bsize[0] !== rows || bsize[1] !== 1) {
119
+ throw new RangeError('Dimension mismatch. Matrix columns must match vector length.')
120
+ }
121
+
122
+ for (let i = 0; i < rows; i++) {
131
123
  data[i] = [b[i][0]]
132
124
  }
133
- // return Dense Matrix
125
+
134
126
  return new DenseMatrix({
135
127
  data: data,
136
128
  size: [rows, 1]
137
129
  })
138
130
  }
139
- // throw error
140
- throw new RangeError('Dimension mismatch. Matrix columns must match vector length.')
131
+
132
+ throw new RangeError('Dimension mismatch. The right side has to be either 1- or 2-dimensional vector.')
141
133
  }
142
134
  }
143
135
  }
@@ -1,13 +1,19 @@
1
+ import { Decimal } from 'decimal.js'
1
2
  import { factory } from '../../utils/factory'
2
3
  import { deepMap } from '../../utils/collection'
3
4
  import { nearlyEqual } from '../../utils/number'
4
5
  import { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual'
5
6
  import { ceilNumber } from '../../plain/number'
7
+ import { createAlgorithm11 } from '../../type/matrix/utils/algorithm11'
8
+ import { createAlgorithm14 } from '../../type/matrix/utils/algorithm14'
6
9
 
7
10
  const name = 'ceil'
8
- const dependencies = ['typed', 'config', 'round']
11
+ const dependencies = ['typed', 'config', 'round', 'matrix', 'equalScalar']
12
+
13
+ export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed, config, round, matrix, equalScalar }) => {
14
+ const algorithm11 = createAlgorithm11({ typed, equalScalar })
15
+ const algorithm14 = createAlgorithm14({ typed })
9
16
 
10
- export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed, config, round }) => {
11
17
  /**
12
18
  * Round a value towards plus infinity
13
19
  * If `x` is complex, both real and imaginary part are rounded towards plus infinity.
@@ -16,6 +22,7 @@ export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed,
16
22
  * Syntax:
17
23
  *
18
24
  * math.ceil(x)
25
+ * math.ceil(x, n)
19
26
  *
20
27
  * Examples:
21
28
  *
@@ -24,16 +31,24 @@ export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed,
24
31
  * math.ceil(-4.2) // returns number -4
25
32
  * math.ceil(-4.7) // returns number -4
26
33
  *
27
- * const c = math.complex(3.2, -2.7)
34
+ * math.ceil(3.212, 2) // returns number 3.22
35
+ * math.ceil(3.288, 2) // returns number 3.29
36
+ * math.ceil(-4.212, 2) // returns number -4.21
37
+ * math.ceil(-4.782, 2) // returns number -4.78
38
+ *
39
+ * const c = math.complex(3.24, -2.71)
28
40
  * math.ceil(c) // returns Complex 4 - 2i
41
+ * math.ceil(c, 1) // returns Complex 3.3 - 2.7i
29
42
  *
30
43
  * math.ceil([3.2, 3.8, -4.7]) // returns Array [4, 4, -4]
44
+ * math.ceil([3.21, 3.82, -4.71], 1) // returns Array [3.3, 3.9, -4.7]
31
45
  *
32
46
  * See also:
33
47
  *
34
48
  * floor, fix, round
35
49
  *
36
50
  * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded
51
+ * @param {number | BigNumber | Array} [n=0] Number of decimals
37
52
  * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
38
53
  */
39
54
  return typed('ceil', {
@@ -45,10 +60,25 @@ export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed,
45
60
  }
46
61
  },
47
62
 
63
+ 'number, number': function (x, n) {
64
+ if (nearlyEqual(x, round(x, n), config.epsilon)) {
65
+ return round(x, n)
66
+ } else {
67
+ let [number, exponent] = `${x}e`.split('e')
68
+ const result = Math.ceil(Number(`${number}e${Number(exponent) + n}`));
69
+ [number, exponent] = `${result}e`.split('e')
70
+ return Number(`${number}e${Number(exponent) - n}`)
71
+ }
72
+ },
73
+
48
74
  Complex: function (x) {
49
75
  return x.ceil()
50
76
  },
51
77
 
78
+ 'Complex, number': function (x, n) {
79
+ return x.ceil(n)
80
+ },
81
+
52
82
  BigNumber: function (x) {
53
83
  if (bigNearlyEqual(x, round(x), config.epsilon)) {
54
84
  return round(x)
@@ -57,13 +87,43 @@ export const createCeil = /* #__PURE__ */ factory(name, dependencies, ({ typed,
57
87
  }
58
88
  },
59
89
 
90
+ 'BigNumber, BigNumber': function (x, n) {
91
+ if (bigNearlyEqual(x, round(x, n), config.epsilon)) {
92
+ return round(x, n)
93
+ } else {
94
+ return x.toDecimalPlaces(n.toNumber(), Decimal.ROUND_CEIL)
95
+ }
96
+ },
97
+
60
98
  Fraction: function (x) {
61
99
  return x.ceil()
62
100
  },
63
101
 
102
+ 'Fraction, number': function (x, n) {
103
+ return x.ceil(n)
104
+ },
105
+
64
106
  'Array | Matrix': function (x) {
65
107
  // deep map collection, skip zeros since ceil(0) = 0
66
108
  return deepMap(x, this, true)
109
+ },
110
+
111
+ 'Array | Matrix, number': function (x, n) {
112
+ // deep map collection, skip zeros since ceil(0) = 0
113
+ return deepMap(x, i => this(i, n), true)
114
+ },
115
+
116
+ 'SparseMatrix, number | BigNumber': function (x, y) {
117
+ return algorithm11(x, y, this, false)
118
+ },
119
+
120
+ 'DenseMatrix, number | BigNumber': function (x, y) {
121
+ return algorithm14(x, y, this, false)
122
+ },
123
+
124
+ 'number | Complex | BigNumber, Array': function (x, y) {
125
+ // use matrix implementation
126
+ return algorithm14(matrix(y), x, this, true).valueOf()
67
127
  }
68
128
  })
69
129
  })
@@ -1,10 +1,12 @@
1
1
  import { factory } from '../../utils/factory'
2
2
  import { deepMap } from '../../utils/collection'
3
+ import { createAlgorithm14 } from '../../type/matrix/utils/algorithm14'
3
4
 
4
5
  const name = 'fix'
5
- const dependencies = ['typed', 'Complex', 'ceil', 'floor']
6
+ const dependencies = ['typed', 'Complex', 'matrix', 'ceil', 'floor']
6
7
 
7
- export const createFix = /* #__PURE__ */ factory(name, dependencies, ({ typed, Complex, ceil, floor }) => {
8
+ export const createFix = /* #__PURE__ */ factory(name, dependencies, ({ typed, Complex, matrix, ceil, floor }) => {
9
+ const algorithm14 = createAlgorithm14({ typed })
8
10
  /**
9
11
  * Round a value towards zero.
10
12
  * For matrices, the function is evaluated element wise.
@@ -20,23 +22,35 @@ export const createFix = /* #__PURE__ */ factory(name, dependencies, ({ typed, C
20
22
  * math.fix(-4.2) // returns number -4
21
23
  * math.fix(-4.7) // returns number -4
22
24
  *
23
- * const c = math.complex(3.2, -2.7)
25
+ * math.fix(3.12, 1) // returns number 3.1
26
+ * math.fix(3.18, 1) // returns number 3.1
27
+ * math.fix(-4.12, 1) // returns number -4.1
28
+ * math.fix(-4.17, 1) // returns number -4.1
29
+ *
30
+ * const c = math.complex(3.22, -2.78)
24
31
  * math.fix(c) // returns Complex 3 - 2i
32
+ * math.fix(c, 1) // returns Complex 3.2 - 2.7i
25
33
  *
26
- * math.fix([3.2, 3.8, -4.7]) // returns Array [3, 3, -4]
34
+ * math.fix([3.2, 3.8, -4.7]) // returns Array [3, 3, -4]
35
+ * math.fix([3.2, 3.8, -4.7], 1) // returns Array [3.2, 3.8, -4.7]
27
36
  *
28
37
  * See also:
29
38
  *
30
39
  * ceil, floor, round
31
40
  *
32
- * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded
33
- * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
41
+ * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded
42
+ * @param {number | BigNumber | Array} [n=0] Number of decimals
43
+ * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
34
44
  */
35
45
  return typed('fix', {
36
46
  number: function (x) {
37
47
  return (x > 0) ? floor(x) : ceil(x)
38
48
  },
39
49
 
50
+ 'number, number | BigNumber': function (x, n) {
51
+ return (x > 0) ? floor(x, n) : ceil(x, n)
52
+ },
53
+
40
54
  Complex: function (x) {
41
55
  return new Complex(
42
56
  (x.re > 0) ? Math.floor(x.re) : Math.ceil(x.re),
@@ -44,17 +58,42 @@ export const createFix = /* #__PURE__ */ factory(name, dependencies, ({ typed, C
44
58
  )
45
59
  },
46
60
 
61
+ 'Complex, number | BigNumber': function (x, n) {
62
+ return new Complex(
63
+ (x.re > 0) ? floor(x.re, n) : ceil(x.re, n),
64
+ (x.im > 0) ? floor(x.im, n) : ceil(x.im, n)
65
+ )
66
+ },
67
+
47
68
  BigNumber: function (x) {
48
69
  return x.isNegative() ? ceil(x) : floor(x)
49
70
  },
50
71
 
72
+ 'BigNumber, number | BigNumber': function (x, n) {
73
+ return x.isNegative() ? ceil(x, n) : floor(x, n)
74
+ },
75
+
51
76
  Fraction: function (x) {
52
77
  return x.s < 0 ? x.ceil() : x.floor()
53
78
  },
54
79
 
80
+ 'Fraction, number | BigNumber': function (x, n) {
81
+ return x.s < 0 ? x.ceil(n) : x.floor(n)
82
+ },
83
+
55
84
  'Array | Matrix': function (x) {
56
85
  // deep map collection, skip zeros since fix(0) = 0
57
86
  return deepMap(x, this, true)
87
+ },
88
+
89
+ 'Array | Matrix, number | BigNumber': function (x, n) {
90
+ // deep map collection, skip zeros since fix(0) = 0
91
+ return deepMap(x, i => this(i, n), true)
92
+ },
93
+
94
+ 'number | Complex | BigNumber, Array': function (x, y) {
95
+ // use matrix implementation
96
+ return algorithm14(matrix(y), x, this, true).valueOf()
58
97
  }
59
98
  })
60
99
  })
@@ -1,12 +1,18 @@
1
+ import { Decimal } from 'decimal.js'
1
2
  import { factory } from '../../utils/factory'
2
3
  import { deepMap } from '../../utils/collection'
3
4
  import { nearlyEqual } from '../../utils/number'
4
5
  import { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual'
6
+ import { createAlgorithm11 } from '../../type/matrix/utils/algorithm11'
7
+ import { createAlgorithm14 } from '../../type/matrix/utils/algorithm14'
5
8
 
6
9
  const name = 'floor'
7
- const dependencies = ['typed', 'config', 'round']
10
+ const dependencies = ['typed', 'config', 'round', 'matrix', 'equalScalar']
11
+
12
+ export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed, config, round, matrix, equalScalar }) => {
13
+ const algorithm11 = createAlgorithm11({ typed, equalScalar })
14
+ const algorithm14 = createAlgorithm14({ typed })
8
15
 
9
- export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed, config, round }) => {
10
16
  /**
11
17
  * Round a value towards minus infinity.
12
18
  * For matrices, the function is evaluated element wise.
@@ -14,6 +20,7 @@ export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed,
14
20
  * Syntax:
15
21
  *
16
22
  * math.floor(x)
23
+ * math.floor(x, n)
17
24
  *
18
25
  * Examples:
19
26
  *
@@ -22,16 +29,24 @@ export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed,
22
29
  * math.floor(-4.2) // returns number -5
23
30
  * math.floor(-4.7) // returns number -5
24
31
  *
25
- * const c = math.complex(3.2, -2.7)
26
- * math.floor(c) // returns Complex 3 - 3i
32
+ * math.floor(3.212, 2) // returns number 3.21
33
+ * math.floor(3.288, 2) // returns number 3.28
34
+ * math.floor(-4.212, 2) // returns number -4.22
35
+ * math.floor(-4.782, 2) // returns number -4.79
36
+ *
37
+ * const c = math.complex(3.24, -2.71)
38
+ * math.floor(c) // returns Complex 3 - 3i
39
+ * math.floor(c, 1) // returns Complex 3.2 - 2.8i
27
40
  *
28
- * math.floor([3.2, 3.8, -4.7]) // returns Array [3, 3, -5]
41
+ * math.floor([3.2, 3.8, -4.7]) // returns Array [3, 3, -5]
42
+ * math.floor([3.21, 3.82, -4.71], 1) // returns Array [3.2, 3.8, -4.8]
29
43
  *
30
44
  * See also:
31
45
  *
32
46
  * ceil, fix, round
33
47
  *
34
48
  * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded
49
+ * @param {number | BigNumber | Array} [n=0] Number of decimals
35
50
  * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
36
51
  */
37
52
  return typed('floor', {
@@ -43,10 +58,25 @@ export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed,
43
58
  }
44
59
  },
45
60
 
61
+ 'number, number': function (x, n) {
62
+ if (nearlyEqual(x, round(x, n), config.epsilon)) {
63
+ return round(x, n)
64
+ } else {
65
+ let [number, exponent] = `${x}e`.split('e')
66
+ const result = Math.floor(Number(`${number}e${Number(exponent) + n}`));
67
+ [number, exponent] = `${result}e`.split('e')
68
+ return Number(`${number}e${Number(exponent) - n}`)
69
+ }
70
+ },
71
+
46
72
  Complex: function (x) {
47
73
  return x.floor()
48
74
  },
49
75
 
76
+ 'Complex, number': function (x, n) {
77
+ return x.floor(n)
78
+ },
79
+
50
80
  BigNumber: function (x) {
51
81
  if (bigNearlyEqual(x, round(x), config.epsilon)) {
52
82
  return round(x)
@@ -55,13 +85,43 @@ export const createFloor = /* #__PURE__ */ factory(name, dependencies, ({ typed,
55
85
  }
56
86
  },
57
87
 
88
+ 'BigNumber, BigNumber': function (x, n) {
89
+ if (bigNearlyEqual(x, round(x, n), config.epsilon)) {
90
+ return round(x, n)
91
+ } else {
92
+ return x.toDecimalPlaces(n.toNumber(), Decimal.ROUND_FLOOR)
93
+ }
94
+ },
95
+
58
96
  Fraction: function (x) {
59
97
  return x.floor()
60
98
  },
61
99
 
100
+ 'Fraction, number': function (x, n) {
101
+ return x.floor(n)
102
+ },
103
+
62
104
  'Array | Matrix': function (x) {
63
105
  // deep map collection, skip zeros since floor(0) = 0
64
106
  return deepMap(x, this, true)
107
+ },
108
+
109
+ 'Array | Matrix, number': function (x, n) {
110
+ // deep map collection, skip zeros since ceil(0) = 0
111
+ return deepMap(x, i => this(i, n), true)
112
+ },
113
+
114
+ 'SparseMatrix, number | BigNumber': function (x, y) {
115
+ return algorithm11(x, y, this, false)
116
+ },
117
+
118
+ 'DenseMatrix, number | BigNumber': function (x, y) {
119
+ return algorithm14(x, y, this, false)
120
+ },
121
+
122
+ 'number | Complex | BigNumber, Array': function (x, y) {
123
+ // use matrix implementation
124
+ return algorithm14(matrix(y), x, this, true).valueOf()
65
125
  }
66
126
  })
67
127
  })
@@ -65,11 +65,18 @@ export const createMod = /* #__PURE__ */ factory(name, dependencies, ({ typed, m
65
65
  'number, number': modNumber,
66
66
 
67
67
  'BigNumber, BigNumber': function (x, y) {
68
+ if (y.isNeg()) {
69
+ throw new Error('Cannot calculate mod for a negative divisor')
70
+ }
68
71
  return y.isZero() ? x : x.mod(y)
69
72
  },
70
73
 
71
74
  'Fraction, Fraction': function (x, y) {
72
- return x.mod(y)
75
+ if (y.compare(0) < 0) {
76
+ throw new Error('Cannot calculate mod for a negative divisor')
77
+ }
78
+ // Workaround suggested in Fraction.js library to calculate correct modulo for negative dividend
79
+ return x.compare(0) >= 0 ? x.mod(y) : x.mod(y).add(y).mod(y)
73
80
  },
74
81
 
75
82
  'SparseMatrix, SparseMatrix': function (x, y) {
@@ -34,10 +34,14 @@ export const createRound = /* #__PURE__ */ factory(name, dependencies, ({ typed,
34
34
  *
35
35
  * Examples:
36
36
  *
37
- * math.round(3.2) // returns number 3
38
- * math.round(3.8) // returns number 4
37
+ * math.round(3.22) // returns number 3
38
+ * math.round(3.82) // returns number 4
39
39
  * math.round(-4.2) // returns number -4
40
40
  * math.round(-4.7) // returns number -5
41
+ * math.round(3.22, 1) // returns number 3.2
42
+ * math.round(3.88, 1) // returns number 3.8
43
+ * math.round(-4.21, 1) // returns number -4.2
44
+ * math.round(-4.71, 1) // returns number -4.7
41
45
  * math.round(math.pi, 3) // returns number 3.142
42
46
  * math.round(123.45678, 2) // returns number 123.46
43
47
  *