simple-squiggle

A restricted subset of Squiggle
Log | Files | Refs | README

round.js (6397B)


      1 import _defineProperty from "@babel/runtime/helpers/defineProperty";
      2 
      3 function ownKeys(object, enumerableOnly) { var keys = Object.keys(object); if (Object.getOwnPropertySymbols) { var symbols = Object.getOwnPropertySymbols(object); enumerableOnly && (symbols = symbols.filter(function (sym) { return Object.getOwnPropertyDescriptor(object, sym).enumerable; })), keys.push.apply(keys, symbols); } return keys; }
      4 
      5 function _objectSpread(target) { for (var i = 1; i < arguments.length; i++) { var source = null != arguments[i] ? arguments[i] : {}; i % 2 ? ownKeys(Object(source), !0).forEach(function (key) { _defineProperty(target, key, source[key]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(target, Object.getOwnPropertyDescriptors(source)) : ownKeys(Object(source)).forEach(function (key) { Object.defineProperty(target, key, Object.getOwnPropertyDescriptor(source, key)); }); } return target; }
      6 
      7 import { factory } from '../../utils/factory.js';
      8 import { deepMap } from '../../utils/collection.js';
      9 import { isInteger } from '../../utils/number.js';
     10 import { createAlgorithm11 } from '../../type/matrix/utils/algorithm11.js';
     11 import { createAlgorithm12 } from '../../type/matrix/utils/algorithm12.js';
     12 import { createAlgorithm14 } from '../../type/matrix/utils/algorithm14.js';
     13 import { roundNumber } from '../../plain/number/index.js';
     14 var NO_INT = 'Number of decimals in function round must be an integer';
     15 var name = 'round';
     16 var dependencies = ['typed', 'matrix', 'equalScalar', 'zeros', 'BigNumber', 'DenseMatrix'];
     17 export var createRound = /* #__PURE__ */factory(name, dependencies, _ref => {
     18   var {
     19     typed,
     20     matrix,
     21     equalScalar,
     22     zeros,
     23     BigNumber,
     24     DenseMatrix
     25   } = _ref;
     26   var algorithm11 = createAlgorithm11({
     27     typed,
     28     equalScalar
     29   });
     30   var algorithm12 = createAlgorithm12({
     31     typed,
     32     DenseMatrix
     33   });
     34   var algorithm14 = createAlgorithm14({
     35     typed
     36   });
     37   /**
     38    * Round a value towards the nearest integer.
     39    * For matrices, the function is evaluated element wise.
     40    *
     41    * Syntax:
     42    *
     43    *    math.round(x)
     44    *    math.round(x, n)
     45    *
     46    * Examples:
     47    *
     48    *    math.round(3.22)             // returns number 3
     49    *    math.round(3.82)             // returns number 4
     50    *    math.round(-4.2)             // returns number -4
     51    *    math.round(-4.7)             // returns number -5
     52    *    math.round(3.22, 1)          // returns number 3.2
     53    *    math.round(3.88, 1)          // returns number 3.9
     54    *    math.round(-4.21, 1)         // returns number -4.2
     55    *    math.round(-4.71, 1)         // returns number -4.7
     56    *    math.round(math.pi, 3)       // returns number 3.142
     57    *    math.round(123.45678, 2)     // returns number 123.46
     58    *
     59    *    const c = math.complex(3.2, -2.7)
     60    *    math.round(c)                // returns Complex 3 - 3i
     61    *
     62    *    math.round([3.2, 3.8, -4.7]) // returns Array [3, 4, -5]
     63    *
     64    * See also:
     65    *
     66    *    ceil, fix, floor
     67    *
     68    * @param  {number | BigNumber | Fraction | Complex | Array | Matrix} x  Number to be rounded
     69    * @param  {number | BigNumber | Array} [n=0]                            Number of decimals
     70    * @return {number | BigNumber | Fraction | Complex | Array | Matrix} Rounded value
     71    */
     72 
     73   return typed(name, _objectSpread(_objectSpread({}, roundNumberSignatures), {}, {
     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 
     82       return x.round(n);
     83     },
     84     'Complex, BigNumber': function ComplexBigNumber(x, n) {
     85       if (!n.isInteger()) {
     86         throw new TypeError(NO_INT);
     87       }
     88 
     89       var _n = n.toNumber();
     90 
     91       return x.round(_n);
     92     },
     93     'number, BigNumber': function numberBigNumber(x, n) {
     94       if (!n.isInteger()) {
     95         throw new TypeError(NO_INT);
     96       }
     97 
     98       return new BigNumber(x).toDecimalPlaces(n.toNumber());
     99     },
    100     BigNumber: function BigNumber(x) {
    101       return x.toDecimalPlaces(0);
    102     },
    103     'BigNumber, BigNumber': function BigNumberBigNumber(x, n) {
    104       if (!n.isInteger()) {
    105         throw new TypeError(NO_INT);
    106       }
    107 
    108       return x.toDecimalPlaces(n.toNumber());
    109     },
    110     Fraction: function Fraction(x) {
    111       return x.round();
    112     },
    113     'Fraction, number': function FractionNumber(x, n) {
    114       if (n % 1) {
    115         throw new TypeError(NO_INT);
    116       }
    117 
    118       return x.round(n);
    119     },
    120     'Array | Matrix': function ArrayMatrix(x) {
    121       // deep map collection, skip zeros since round(0) = 0
    122       return deepMap(x, this, true);
    123     },
    124     'SparseMatrix, number | BigNumber': function SparseMatrixNumberBigNumber(x, y) {
    125       return algorithm11(x, y, this, false);
    126     },
    127     'DenseMatrix, number | BigNumber': function DenseMatrixNumberBigNumber(x, y) {
    128       return algorithm14(x, y, this, false);
    129     },
    130     'number | Complex | BigNumber, SparseMatrix': function numberComplexBigNumberSparseMatrix(x, y) {
    131       // check scalar is zero
    132       if (equalScalar(x, 0)) {
    133         // do not execute algorithm, result will be a zero matrix
    134         return zeros(y.size(), y.storage());
    135       }
    136 
    137       return algorithm12(y, x, this, true);
    138     },
    139     'number | Complex | BigNumber, DenseMatrix': function numberComplexBigNumberDenseMatrix(x, y) {
    140       // check scalar is zero
    141       if (equalScalar(x, 0)) {
    142         // do not execute algorithm, result will be a zero matrix
    143         return zeros(y.size(), y.storage());
    144       }
    145 
    146       return algorithm14(y, x, this, true);
    147     },
    148     'Array, number | BigNumber': function ArrayNumberBigNumber(x, y) {
    149       // use matrix implementation
    150       return algorithm14(matrix(x), y, this, false).valueOf();
    151     },
    152     'number | Complex | BigNumber, Array': function numberComplexBigNumberArray(x, y) {
    153       // use matrix implementation
    154       return algorithm14(matrix(y), x, this, true).valueOf();
    155     }
    156   }));
    157 });
    158 var roundNumberSignatures = {
    159   number: roundNumber,
    160   'number, number': function numberNumber(x, n) {
    161     if (!isInteger(n)) {
    162       throw new TypeError(NO_INT);
    163     }
    164 
    165     if (n < 0 || n > 15) {
    166       throw new Error('Number of decimals in function round must be in the range of 0-15');
    167     }
    168 
    169     return roundNumber(x, n);
    170   }
    171 };
    172 export var createRoundNumber = /* #__PURE__ */factory(name, ['typed'], _ref2 => {
    173   var {
    174     typed
    175   } = _ref2;
    176   return typed(name, roundNumberSignatures);
    177 });