ceil.js 5.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161
  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 = 'ceil';
  10. var dependencies = ['typed', 'config', 'round', 'matrix', 'equalScalar', 'zeros', 'DenseMatrix'];
  11. export var createCeilNumber = /* #__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.ceil(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.ceil(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 createCeil = /* #__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 ceilNumber = createCeilNumber({
  59. typed,
  60. config,
  61. round
  62. });
  63. /**
  64. * Round a value towards plus infinity
  65. * If `x` is complex, both real and imaginary part are rounded towards plus infinity.
  66. * For matrices, the function is evaluated element wise.
  67. *
  68. * Syntax:
  69. *
  70. * math.ceil(x)
  71. * math.ceil(x, n)
  72. *
  73. * Examples:
  74. *
  75. * math.ceil(3.2) // returns number 4
  76. * math.ceil(3.8) // returns number 4
  77. * math.ceil(-4.2) // returns number -4
  78. * math.ceil(-4.7) // returns number -4
  79. *
  80. * math.ceil(3.212, 2) // returns number 3.22
  81. * math.ceil(3.288, 2) // returns number 3.29
  82. * math.ceil(-4.212, 2) // returns number -4.21
  83. * math.ceil(-4.782, 2) // returns number -4.78
  84. *
  85. * const c = math.complex(3.24, -2.71)
  86. * math.ceil(c) // returns Complex 4 - 2i
  87. * math.ceil(c, 1) // returns Complex 3.3 - 2.7i
  88. *
  89. * math.ceil([3.2, 3.8, -4.7]) // returns Array [4, 4, -4]
  90. * math.ceil([3.21, 3.82, -4.71], 1) // returns Array [3.3, 3.9, -4.7]
  91. *
  92. * See also:
  93. *
  94. * floor, fix, round
  95. *
  96. * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded
  97. * @param {number | BigNumber | Array} [n=0] Number of decimals
  98. * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
  99. */
  100. return typed('ceil', {
  101. number: ceilNumber.signatures.number,
  102. 'number,number': ceilNumber.signatures['number,number'],
  103. Complex: function Complex(x) {
  104. return x.ceil();
  105. },
  106. 'Complex, number': function ComplexNumber(x, n) {
  107. return x.ceil(n);
  108. },
  109. 'Complex, BigNumber': function ComplexBigNumber(x, n) {
  110. return x.ceil(n.toNumber());
  111. },
  112. BigNumber: function BigNumber(x) {
  113. if (bigNearlyEqual(x, round(x), config.epsilon)) {
  114. return round(x);
  115. } else {
  116. return x.ceil();
  117. }
  118. },
  119. 'BigNumber, BigNumber': function BigNumberBigNumber(x, n) {
  120. if (bigNearlyEqual(x, round(x, n), config.epsilon)) {
  121. return round(x, n);
  122. } else {
  123. return x.toDecimalPlaces(n.toNumber(), Decimal.ROUND_CEIL);
  124. }
  125. },
  126. Fraction: function Fraction(x) {
  127. return x.ceil();
  128. },
  129. 'Fraction, number': function FractionNumber(x, n) {
  130. return x.ceil(n);
  131. },
  132. 'Fraction, BigNumber': function FractionBigNumber(x, n) {
  133. return x.ceil(n.toNumber());
  134. },
  135. 'Array | Matrix': typed.referToSelf(self => x => {
  136. // deep map collection, skip zeros since ceil(0) = 0
  137. return deepMap(x, self, true);
  138. }),
  139. 'Array, number | BigNumber': typed.referToSelf(self => (x, n) => {
  140. // deep map collection, skip zeros since ceil(0) = 0
  141. return deepMap(x, i => self(i, n), true);
  142. }),
  143. 'SparseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {
  144. return matAlgo11xS0s(x, y, self, false);
  145. }),
  146. 'DenseMatrix, number | BigNumber': typed.referToSelf(self => (x, y) => {
  147. return matAlgo14xDs(x, y, self, false);
  148. }),
  149. 'number | Complex | Fraction | BigNumber, Array': typed.referToSelf(self => (x, y) => {
  150. // use matrix implementation
  151. return matAlgo14xDs(matrix(y), x, self, true).valueOf();
  152. }),
  153. 'number | Complex | Fraction | BigNumber, Matrix': typed.referToSelf(self => (x, y) => {
  154. if (equalScalar(x, 0)) return zeros(y.size(), y.storage());
  155. if (y.storage() === 'dense') {
  156. return matAlgo14xDs(y, x, self, true);
  157. }
  158. return matAlgo12xSfs(y, x, self, true);
  159. })
  160. });
  161. });