round.js 5.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148
  1. import { factory } from '../../utils/factory.js';
  2. import { deepMap } from '../../utils/collection.js';
  3. import { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';
  4. import { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';
  5. import { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';
  6. import { roundNumber } from '../../plain/number/index.js';
  7. var NO_INT = 'Number of decimals in function round must be an integer';
  8. var name = 'round';
  9. var dependencies = ['typed', 'matrix', 'equalScalar', 'zeros', 'BigNumber', 'DenseMatrix'];
  10. export var createRound = /* #__PURE__ */factory(name, dependencies, _ref => {
  11. var {
  12. typed,
  13. matrix,
  14. equalScalar,
  15. zeros,
  16. BigNumber,
  17. DenseMatrix
  18. } = _ref;
  19. var matAlgo11xS0s = createMatAlgo11xS0s({
  20. typed,
  21. equalScalar
  22. });
  23. var matAlgo12xSfs = createMatAlgo12xSfs({
  24. typed,
  25. DenseMatrix
  26. });
  27. var matAlgo14xDs = createMatAlgo14xDs({
  28. typed
  29. });
  30. /**
  31. * Round a value towards the nearest integer.
  32. * For matrices, the function is evaluated element wise.
  33. *
  34. * Syntax:
  35. *
  36. * math.round(x)
  37. * math.round(x, n)
  38. *
  39. * Examples:
  40. *
  41. * math.round(3.22) // returns number 3
  42. * math.round(3.82) // returns number 4
  43. * math.round(-4.2) // returns number -4
  44. * math.round(-4.7) // returns number -5
  45. * math.round(3.22, 1) // returns number 3.2
  46. * math.round(3.88, 1) // returns number 3.9
  47. * math.round(-4.21, 1) // returns number -4.2
  48. * math.round(-4.71, 1) // returns number -4.7
  49. * math.round(math.pi, 3) // returns number 3.142
  50. * math.round(123.45678, 2) // returns number 123.46
  51. *
  52. * const c = math.complex(3.2, -2.7)
  53. * math.round(c) // returns Complex 3 - 3i
  54. *
  55. * math.round([3.2, 3.8, -4.7]) // returns Array [3, 4, -5]
  56. *
  57. * See also:
  58. *
  59. * ceil, fix, floor
  60. *
  61. * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded
  62. * @param {number | BigNumber | Array} [n=0] Number of decimals
  63. * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
  64. */
  65. return typed(name, {
  66. number: roundNumber,
  67. 'number, number': roundNumber,
  68. 'number, BigNumber': function numberBigNumber(x, n) {
  69. if (!n.isInteger()) {
  70. throw new TypeError(NO_INT);
  71. }
  72. return new BigNumber(x).toDecimalPlaces(n.toNumber());
  73. },
  74. Complex: function Complex(x) {
  75. return x.round();
  76. },
  77. 'Complex, number': function ComplexNumber(x, n) {
  78. if (n % 1) {
  79. throw new TypeError(NO_INT);
  80. }
  81. return x.round(n);
  82. },
  83. 'Complex, BigNumber': function ComplexBigNumber(x, n) {
  84. if (!n.isInteger()) {
  85. throw new TypeError(NO_INT);
  86. }
  87. var _n = n.toNumber();
  88. return x.round(_n);
  89. },
  90. BigNumber: function BigNumber(x) {
  91. return x.toDecimalPlaces(0);
  92. },
  93. 'BigNumber, BigNumber': function BigNumberBigNumber(x, n) {
  94. if (!n.isInteger()) {
  95. throw new TypeError(NO_INT);
  96. }
  97. return x.toDecimalPlaces(n.toNumber());
  98. },
  99. Fraction: function Fraction(x) {
  100. return x.round();
  101. },
  102. 'Fraction, number': function FractionNumber(x, n) {
  103. if (n % 1) {
  104. throw new TypeError(NO_INT);
  105. }
  106. return x.round(n);
  107. },
  108. 'Fraction, BigNumber': function FractionBigNumber(x, n) {
  109. if (!n.isInteger()) {
  110. throw new TypeError(NO_INT);
  111. }
  112. return x.round(n.toNumber());
  113. },
  114. // deep map collection, skip zeros since round(0) = 0
  115. 'Array | Matrix': typed.referToSelf(self => x => deepMap(x, self, true)),
  116. 'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {
  117. return matAlgo11xS0s(x, y, self, false);
  118. }),
  119. 'DenseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {
  120. return matAlgo14xDs(x, y, self, false);
  121. }),
  122. 'Array, number | BigNumber': typed.referToSelf(self => (x, y) => {
  123. // use matrix implementation
  124. return matAlgo14xDs(matrix(x), y, self, false).valueOf();
  125. }),
  126. 'number | Complex | BigNumber | Fraction, SparseMatrix': typed.referToSelf(self => (x, y) => {
  127. // check scalar is zero
  128. if (equalScalar(x, 0)) {
  129. // do not execute algorithm, result will be a zero matrix
  130. return zeros(y.size(), y.storage());
  131. }
  132. return matAlgo12xSfs(y, x, self, true);
  133. }),
  134. 'number | Complex | BigNumber | Fraction, DenseMatrix': typed.referToSelf(self => (x, y) => {
  135. // check scalar is zero
  136. if (equalScalar(x, 0)) {
  137. // do not execute algorithm, result will be a zero matrix
  138. return zeros(y.size(), y.storage());
  139. }
  140. return matAlgo14xDs(y, x, self, true);
  141. }),
  142. 'number | Complex | BigNumber | Fraction, Array': typed.referToSelf(self => (x, y) => {
  143. // use matrix implementation
  144. return matAlgo14xDs(matrix(y), x, self, true).valueOf();
  145. })
  146. });
  147. });