floor.js 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164
  1. import Decimal from 'decimal.js';
  2. import { factory } from '../../utils/factory.js';
  3. import { deepMap } from '../../utils/collection.js';
  4. import { nearlyEqual } from '../../utils/number.js';
  5. import { nearlyEqual as bigNearlyEqual } from '../../utils/bignumber/nearlyEqual.js';
  6. import { createMatAlgo11xS0s } from '../../type/matrix/utils/matAlgo11xS0s.js';
  7. import { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';
  8. import { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';
  9. var name = 'floor';
  10. var dependencies = ['typed', 'config', 'round', 'matrix', 'equalScalar', 'zeros', 'DenseMatrix'];
  11. export var createFloorNumber = /* #__PURE__ */factory(name, ['typed', 'config', 'round'], _ref => {
  12. var {
  13. typed,
  14. config,
  15. round
  16. } = _ref;
  17. return typed(name, {
  18. number: function number(x) {
  19. if (nearlyEqual(x, round(x), config.epsilon)) {
  20. return round(x);
  21. } else {
  22. return Math.floor(x);
  23. }
  24. },
  25. 'number, number': function numberNumber(x, n) {
  26. if (nearlyEqual(x, round(x, n), config.epsilon)) {
  27. return round(x, n);
  28. } else {
  29. var [number, exponent] = "".concat(x, "e").split('e');
  30. var result = Math.floor(Number("".concat(number, "e").concat(Number(exponent) + n)));
  31. [number, exponent] = "".concat(result, "e").split('e');
  32. return Number("".concat(number, "e").concat(Number(exponent) - n));
  33. }
  34. }
  35. });
  36. });
  37. export var createFloor = /* #__PURE__ */factory(name, dependencies, _ref2 => {
  38. var {
  39. typed,
  40. config,
  41. round,
  42. matrix,
  43. equalScalar,
  44. zeros,
  45. DenseMatrix
  46. } = _ref2;
  47. var matAlgo11xS0s = createMatAlgo11xS0s({
  48. typed,
  49. equalScalar
  50. });
  51. var matAlgo12xSfs = createMatAlgo12xSfs({
  52. typed,
  53. DenseMatrix
  54. });
  55. var matAlgo14xDs = createMatAlgo14xDs({
  56. typed
  57. });
  58. var floorNumber = createFloorNumber({
  59. typed,
  60. config,
  61. round
  62. });
  63. /**
  64. * Round a value towards minus infinity.
  65. * For matrices, the function is evaluated element wise.
  66. *
  67. * Syntax:
  68. *
  69. * math.floor(x)
  70. * math.floor(x, n)
  71. *
  72. * Examples:
  73. *
  74. * math.floor(3.2) // returns number 3
  75. * math.floor(3.8) // returns number 3
  76. * math.floor(-4.2) // returns number -5
  77. * math.floor(-4.7) // returns number -5
  78. *
  79. * math.floor(3.212, 2) // returns number 3.21
  80. * math.floor(3.288, 2) // returns number 3.28
  81. * math.floor(-4.212, 2) // returns number -4.22
  82. * math.floor(-4.782, 2) // returns number -4.79
  83. *
  84. * const c = math.complex(3.24, -2.71)
  85. * math.floor(c) // returns Complex 3 - 3i
  86. * math.floor(c, 1) // returns Complex 3.2 -2.8i
  87. *
  88. * math.floor([3.2, 3.8, -4.7]) // returns Array [3, 3, -5]
  89. * math.floor([3.21, 3.82, -4.71], 1) // returns Array [3.2, 3.8, -4.8]
  90. *
  91. * math.floor(math.tau, [2, 3]) // returns Array [6.28, 6.283]
  92. *
  93. * // Note that floor(array, array) currently not implemented.
  94. *
  95. * See also:
  96. *
  97. * ceil, fix, round
  98. *
  99. * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded
  100. * @param {number | BigNumber | Array} [n=0] Number of decimals
  101. * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
  102. */
  103. return typed('floor', {
  104. number: floorNumber.signatures.number,
  105. 'number,number': floorNumber.signatures['number,number'],
  106. Complex: function Complex(x) {
  107. return x.floor();
  108. },
  109. 'Complex, number': function ComplexNumber(x, n) {
  110. return x.floor(n);
  111. },
  112. 'Complex, BigNumber': function ComplexBigNumber(x, n) {
  113. return x.floor(n.toNumber());
  114. },
  115. BigNumber: function BigNumber(x) {
  116. if (bigNearlyEqual(x, round(x), config.epsilon)) {
  117. return round(x);
  118. } else {
  119. return x.floor();
  120. }
  121. },
  122. 'BigNumber, BigNumber': function BigNumberBigNumber(x, n) {
  123. if (bigNearlyEqual(x, round(x, n), config.epsilon)) {
  124. return round(x, n);
  125. } else {
  126. return x.toDecimalPlaces(n.toNumber(), Decimal.ROUND_FLOOR);
  127. }
  128. },
  129. Fraction: function Fraction(x) {
  130. return x.floor();
  131. },
  132. 'Fraction, number': function FractionNumber(x, n) {
  133. return x.floor(n);
  134. },
  135. 'Fraction, BigNumber': function FractionBigNumber(x, n) {
  136. return x.floor(n.toNumber());
  137. },
  138. 'Array | Matrix': typed.referToSelf(self => x => {
  139. // deep map collection, skip zeros since floor(0) = 0
  140. return deepMap(x, self, true);
  141. }),
  142. 'Array, number | BigNumber': typed.referToSelf(self => (x, n) => {
  143. // deep map collection, skip zeros since ceil(0) = 0
  144. return deepMap(x, i => self(i, n), true);
  145. }),
  146. 'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {
  147. return matAlgo11xS0s(x, y, self, false);
  148. }),
  149. 'DenseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {
  150. return matAlgo14xDs(x, y, self, false);
  151. }),
  152. 'number | Complex | Fraction | BigNumber, Array': typed.referToSelf(self => (x, y) => {
  153. // use matrix implementation
  154. return matAlgo14xDs(matrix(y), x, self, true).valueOf();
  155. }),
  156. 'number | Complex | Fraction | BigNumber, Matrix': typed.referToSelf(self => (x, y) => {
  157. if (equalScalar(x, 0)) return zeros(y.size(), y.storage());
  158. if (y.storage() === 'dense') {
  159. return matAlgo14xDs(y, x, self, true);
  160. }
  161. return matAlgo12xSfs(y, x, self, true);
  162. })
  163. });
  164. });