round.js 5.6 KB

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