simple-squiggle

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

round.js (6986B)


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