UNPKG

ilib-common

Version:

Common utility functions for ilib. iLib is a cross-engine library of internationalization (i18n) classes written in pure JS

121 lines (120 loc) 6.55 kB
"use strict";Object.defineProperty(exports,"__esModule",{value:true});exports.amod=amod;exports.ceiling=ceiling;exports.down=down;exports.floor=floor;exports.halfdown=halfdown;exports.halfeven=halfeven;exports.halfodd=halfodd;exports.halfup=halfup;exports.log10=log10;exports.mod=mod;exports.shiftDecimal=shiftDecimal;exports.significant=significant;exports.signum=signum;exports.up=up;/* * MathUtils.js - Misc math utility routines * * Copyright © 2013-2015, 2018, 2022 JEDLSoft * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * * See the License for the specific language governing permissions and * limitations under the License. *//** * @module MathUtils *//** * Return the sign of the given number. If the sign is negative, this function * returns -1. If the sign is positive or zero, this function returns 1. * @static * @param {number} num the number to test * @return {number} -1 if the number is negative, and 1 otherwise */function signum(num){var n=num;if(typeof num==="string"){n=parseInt(num,10)}else if(typeof num!=="number"){return 1}return n<0?-1:1};/** * @static * @protected * @param {number} num number to round * @return {number} rounded number */function floor(num){return Math.floor(num)};/** * @static * @protected * @param {number} num number to round * @return {number} rounded number */function ceiling(num){return Math.ceil(num)};/** * Round a number towards 0. * * @param {number} num number to round * @return {number} rounded number */function down(num){return num<0?Math.ceil(num):Math.floor(num)};/** * Round a number away from 0. * * @param {number} num number to round * @return {number} rounded number */function up(num){return num<0?Math.floor(num):Math.ceil(num)};/** * Round a number up away from 0 if it is half way or larger, otherwise * round down. * * @param {number} num number to round * @return {number} rounded number */function halfup(num){return num<0?Math.ceil(num-0.5):Math.floor(num+0.5)};/** * Round a number down towards 0 if it is half way or smaller, otherwise * round up. * * @param {number} num number to round * @return {number} rounded number */function halfdown(num){return num<0?Math.floor(num+0.5):Math.ceil(num-0.5)};/** * Round numbers up to the closest even number. * * @param {number} num number to round * @return {number} rounded number */function halfeven(num){return Math.floor(num)%2===0?Math.ceil(num-0.5):Math.floor(num+0.5)};/** * Round numbers up to the closest odd number. * * @param {number} num number to round * @return {number} rounded number */function halfodd(num){return Math.floor(num)%2!==0?Math.ceil(num-0.5):Math.floor(num+0.5)};/** * Do a proper modulo function. The Javascript % operator will give the truncated * division algorithm, but for calendrical calculations, we need the Euclidean * division algorithm where the remainder of any division, whether the dividend * is negative or not, is always a positive number in the range [0, modulus).<p> * * @param {number} dividend the number being divided * @param {number} modulus the number dividing the dividend. This should always be a positive number. * @return the remainder of dividing the dividend by the modulus. */function mod(dividend,modulus){if(modulus==0){return 0}var x=dividend%modulus;return x<0?x+modulus:x};/** * Do a proper adjusted modulo function. The Javascript % operator will give the truncated * division algorithm, but for calendrical calculations, we need the Euclidean * division algorithm where the remainder of any division, whether the dividend * is negative or not, is always a positive number in the range (0, modulus]. The adjusted * modulo function differs from the regular modulo function in that when the remainder is * zero, the modulus should be returned instead.<p> * * @param {number} dividend the number being divided * @param {number} modulus the number dividing the dividend. This should always be a positive number. * @return the remainder of dividing the dividend by the modulus. */function amod(dividend,modulus){if(modulus==0){return 0}var x=dividend%modulus;return x<=0?x+modulus:x};/** * Return the number with the decimal shifted by the given precision. * Positive precisions shift the decimal to the right giving larger * numbers, and negative ones shift the decimal to the left giving * smaller numbers. * * @param {number} number the number to shift * @param {number} precision the number of places to move the decimal point * @returns {number} the number with the decimal point shifted by the * given number of decimals */function shiftDecimal(number,precision){var numArray=(""+number).split("e");return+(numArray[0]+"e"+(numArray[1]?+numArray[1]+precision:precision))};/** * Returns the base 10 logarithm of a number. For platforms that support * Math.log10() it is used directly. For plaforms that do not, such as Qt/QML, * it will be calculated using a polyfill. * * @param {number} num the number to take the logarithm of * @returns {number} the base-10 logarithm of the given number */function log10(num){if(typeof Math.log10==="function"){return Math.log10(num)}return Math.log(num)/Math.LN10};/** * Return the given number with only the given number of significant digits. * The number of significant digits can start with the digits greater than * 1 and straddle the decimal point, or it may start after the decimal point. * If the number of digits requested is less than 1, the original number * will be returned unchanged. * * @static * @param {number} number the number to return with only significant digits * @param {number} digits the number of significant digits to include in the * returned number * @param {function(number): number=} round a rounding function to use * @returns {number} the given number with only the requested number of * significant digits */function significant(number,digits,round){if(digits<1||number===0)return number;var rnd=round||Math.round;var factor=-Math.floor(log10(Math.abs(number)))+digits-1;return shiftDecimal(rnd(shiftDecimal(number,factor)),-factor)}; //# sourceMappingURL=MathUtils.js.map