fix.js 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126
  1. import { factory } from '../../utils/factory.js';
  2. import { deepMap } from '../../utils/collection.js';
  3. import { createMatAlgo12xSfs } from '../../type/matrix/utils/matAlgo12xSfs.js';
  4. import { createMatAlgo14xDs } from '../../type/matrix/utils/matAlgo14xDs.js';
  5. var name = 'fix';
  6. var dependencies = ['typed', 'Complex', 'matrix', 'ceil', 'floor', 'equalScalar', 'zeros', 'DenseMatrix'];
  7. export var createFixNumber = /* #__PURE__ */factory(name, ['typed', 'ceil', 'floor'], _ref => {
  8. var {
  9. typed,
  10. ceil,
  11. floor
  12. } = _ref;
  13. return typed(name, {
  14. number: function number(x) {
  15. return x > 0 ? floor(x) : ceil(x);
  16. },
  17. 'number, number': function numberNumber(x, n) {
  18. return x > 0 ? floor(x, n) : ceil(x, n);
  19. }
  20. });
  21. });
  22. export var createFix = /* #__PURE__ */factory(name, dependencies, _ref2 => {
  23. var {
  24. typed,
  25. Complex: _Complex,
  26. matrix,
  27. ceil,
  28. floor,
  29. equalScalar,
  30. zeros,
  31. DenseMatrix
  32. } = _ref2;
  33. var matAlgo12xSfs = createMatAlgo12xSfs({
  34. typed,
  35. DenseMatrix
  36. });
  37. var matAlgo14xDs = createMatAlgo14xDs({
  38. typed
  39. });
  40. var fixNumber = createFixNumber({
  41. typed,
  42. ceil,
  43. floor
  44. });
  45. /**
  46. * Round a value towards zero.
  47. * For matrices, the function is evaluated element wise.
  48. *
  49. * Syntax:
  50. *
  51. * math.fix(x)
  52. * math.fix(x,n)
  53. *
  54. * Examples:
  55. *
  56. * math.fix(3.2) // returns number 3
  57. * math.fix(3.8) // returns number 3
  58. * math.fix(-4.2) // returns number -4
  59. * math.fix(-4.7) // returns number -4
  60. *
  61. * math.fix(3.12, 1) // returns number 3.1
  62. * math.fix(3.18, 1) // returns number 3.1
  63. * math.fix(-4.12, 1) // returns number -4.1
  64. * math.fix(-4.17, 1) // returns number -4.1
  65. *
  66. * const c = math.complex(3.22, -2.78)
  67. * math.fix(c) // returns Complex 3 - 2i
  68. * math.fix(c, 1) // returns Complex 3.2 -2.7i
  69. *
  70. * math.fix([3.2, 3.8, -4.7]) // returns Array [3, 3, -4]
  71. * math.fix([3.2, 3.8, -4.7], 1) // returns Array [3.2, 3.8, -4.7]
  72. *
  73. * See also:
  74. *
  75. * ceil, floor, round
  76. *
  77. * @param {number | BigNumber | Fraction | Complex | Array | Matrix} x Number to be rounded
  78. * @param {number | BigNumber | Array} [n=0] Number of decimals
  79. * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
  80. */
  81. return typed('fix', {
  82. number: fixNumber.signatures.number,
  83. 'number, number | BigNumber': fixNumber.signatures['number,number'],
  84. Complex: function Complex(x) {
  85. return new _Complex(x.re > 0 ? Math.floor(x.re) : Math.ceil(x.re), x.im > 0 ? Math.floor(x.im) : Math.ceil(x.im));
  86. },
  87. 'Complex, number': function ComplexNumber(x, n) {
  88. return new _Complex(x.re > 0 ? floor(x.re, n) : ceil(x.re, n), x.im > 0 ? floor(x.im, n) : ceil(x.im, n));
  89. },
  90. 'Complex, BigNumber': function ComplexBigNumber(x, bn) {
  91. var n = bn.toNumber();
  92. return new _Complex(x.re > 0 ? floor(x.re, n) : ceil(x.re, n), x.im > 0 ? floor(x.im, n) : ceil(x.im, n));
  93. },
  94. BigNumber: function BigNumber(x) {
  95. return x.isNegative() ? ceil(x) : floor(x);
  96. },
  97. 'BigNumber, number | BigNumber': function BigNumberNumberBigNumber(x, n) {
  98. return x.isNegative() ? ceil(x, n) : floor(x, n);
  99. },
  100. Fraction: function Fraction(x) {
  101. return x.s < 0 ? x.ceil() : x.floor();
  102. },
  103. 'Fraction, number | BigNumber': function FractionNumberBigNumber(x, n) {
  104. return x.s < 0 ? ceil(x, n) : floor(x, n);
  105. },
  106. 'Array | Matrix': typed.referToSelf(self => x => {
  107. // deep map collection, skip zeros since fix(0) = 0
  108. return deepMap(x, self, true);
  109. }),
  110. 'Array | Matrix, number | BigNumber': typed.referToSelf(self => (x, n) => {
  111. // deep map collection, skip zeros since fix(0) = 0
  112. return deepMap(x, i => self(i, n), true);
  113. }),
  114. 'number | Complex | Fraction | BigNumber, Array': typed.referToSelf(self => (x, y) => {
  115. // use matrix implementation
  116. return matAlgo14xDs(matrix(y), x, self, true).valueOf();
  117. }),
  118. 'number | Complex | Fraction | BigNumber, Matrix': typed.referToSelf(self => (x, y) => {
  119. if (equalScalar(x, 0)) return zeros(y.size(), y.storage());
  120. if (y.storage() === 'dense') {
  121. return matAlgo14xDs(y, x, self, true);
  122. }
  123. return matAlgo12xSfs(y, x, self, true);
  124. })
  125. });
  126. });