UNPKG

8.2 kBJavaScriptView Raw
1"use strict";
2
3Object.defineProperty(exports, "__esModule", {
4 value: true
5});
6exports.absNumber = absNumber;
7exports.addNumber = addNumber;
8exports.subtractNumber = subtractNumber;
9exports.multiplyNumber = multiplyNumber;
10exports.divideNumber = divideNumber;
11exports.unaryMinusNumber = unaryMinusNumber;
12exports.unaryPlusNumber = unaryPlusNumber;
13exports.cbrtNumber = cbrtNumber;
14exports.ceilNumber = ceilNumber;
15exports.cubeNumber = cubeNumber;
16exports.expNumber = expNumber;
17exports.expm1Number = expm1Number;
18exports.fixNumber = fixNumber;
19exports.floorNumber = floorNumber;
20exports.gcdNumber = gcdNumber;
21exports.lcmNumber = lcmNumber;
22exports.logNumber = logNumber;
23exports.log10Number = log10Number;
24exports.log2Number = log2Number;
25exports.log1pNumber = log1pNumber;
26exports.modNumber = modNumber;
27exports.nthRootNumber = nthRootNumber;
28exports.signNumber = signNumber;
29exports.sqrtNumber = sqrtNumber;
30exports.squareNumber = squareNumber;
31exports.xgcdNumber = xgcdNumber;
32exports.powNumber = powNumber;
33exports.roundNumber = roundNumber;
34exports.normNumber = normNumber;
35
36var _number = require("../../utils/number.js");
37
38var n1 = 'number';
39var n2 = 'number, number';
40
41function absNumber(a) {
42 return Math.abs(a);
43}
44
45absNumber.signature = n1;
46
47function addNumber(a, b) {
48 return a + b;
49}
50
51addNumber.signature = n2;
52
53function subtractNumber(a, b) {
54 return a - b;
55}
56
57subtractNumber.signature = n2;
58
59function multiplyNumber(a, b) {
60 return a * b;
61}
62
63multiplyNumber.signature = n2;
64
65function divideNumber(a, b) {
66 return a / b;
67}
68
69divideNumber.signature = n2;
70
71function unaryMinusNumber(x) {
72 return -x;
73}
74
75unaryMinusNumber.signature = n1;
76
77function unaryPlusNumber(x) {
78 return x;
79}
80
81unaryPlusNumber.signature = n1;
82
83function cbrtNumber(x) {
84 return (0, _number.cbrt)(x);
85}
86
87cbrtNumber.signature = n1;
88
89function ceilNumber(x) {
90 return Math.ceil(x);
91}
92
93ceilNumber.signature = n1;
94
95function cubeNumber(x) {
96 return x * x * x;
97}
98
99cubeNumber.signature = n1;
100
101function expNumber(x) {
102 return Math.exp(x);
103}
104
105expNumber.signature = n1;
106
107function expm1Number(x) {
108 return (0, _number.expm1)(x);
109}
110
111expm1Number.signature = n1;
112
113function fixNumber(x) {
114 return x > 0 ? Math.floor(x) : Math.ceil(x);
115}
116
117fixNumber.signature = n1;
118
119function floorNumber(x) {
120 return Math.floor(x);
121}
122
123floorNumber.signature = n1;
124/**
125 * Calculate gcd for numbers
126 * @param {number} a
127 * @param {number} b
128 * @returns {number} Returns the greatest common denominator of a and b
129 */
130
131function gcdNumber(a, b) {
132 if (!(0, _number.isInteger)(a) || !(0, _number.isInteger)(b)) {
133 throw new Error('Parameters in function gcd must be integer numbers');
134 } // https://en.wikipedia.org/wiki/Euclidean_algorithm
135
136
137 var r;
138
139 while (b !== 0) {
140 r = a % b;
141 a = b;
142 b = r;
143 }
144
145 return a < 0 ? -a : a;
146}
147
148gcdNumber.signature = n2;
149/**
150 * Calculate lcm for two numbers
151 * @param {number} a
152 * @param {number} b
153 * @returns {number} Returns the least common multiple of a and b
154 */
155
156function lcmNumber(a, b) {
157 if (!(0, _number.isInteger)(a) || !(0, _number.isInteger)(b)) {
158 throw new Error('Parameters in function lcm must be integer numbers');
159 }
160
161 if (a === 0 || b === 0) {
162 return 0;
163 } // https://en.wikipedia.org/wiki/Euclidean_algorithm
164 // evaluate lcm here inline to reduce overhead
165
166
167 var t;
168 var prod = a * b;
169
170 while (b !== 0) {
171 t = b;
172 b = a % t;
173 a = t;
174 }
175
176 return Math.abs(prod / a);
177}
178
179lcmNumber.signature = n2;
180/**
181 * Calculate the logarithm of a value.
182 * @param {number} x
183 * @return {number}
184 */
185
186function logNumber(x) {
187 return Math.log(x);
188}
189
190logNumber.signature = n1;
191/**
192 * Calculate the 10-base logarithm of a number
193 * @param {number} x
194 * @return {number}
195 */
196
197function log10Number(x) {
198 return (0, _number.log10)(x);
199}
200
201log10Number.signature = n1;
202/**
203 * Calculate the 2-base logarithm of a number
204 * @param {number} x
205 * @return {number}
206 */
207
208function log2Number(x) {
209 return (0, _number.log2)(x);
210}
211
212log2Number.signature = n1;
213/**
214 * Calculate the natural logarithm of a `number+1`
215 * @param {number} x
216 * @returns {number}
217 */
218
219function log1pNumber(x) {
220 return (0, _number.log1p)(x);
221}
222
223log1pNumber.signature = n1;
224/**
225 * Calculate the modulus of two numbers
226 * @param {number} x
227 * @param {number} y
228 * @returns {number} res
229 * @private
230 */
231
232function modNumber(x, y) {
233 if (y > 0) {
234 // We don't use JavaScript's % operator here as this doesn't work
235 // correctly for x < 0 and x === 0
236 // see https://en.wikipedia.org/wiki/Modulo_operation
237 return x - y * Math.floor(x / y);
238 } else if (y === 0) {
239 return x;
240 } else {
241 // y < 0
242 // TODO: implement mod for a negative divisor
243 throw new Error('Cannot calculate mod for a negative divisor');
244 }
245}
246
247modNumber.signature = n2;
248/**
249 * Calculate the nth root of a, solve x^root == a
250 * http://rosettacode.org/wiki/Nth_root#JavaScript
251 * @param {number} a
252 * @param {number} root
253 * @private
254 */
255
256function nthRootNumber(a, root) {
257 var inv = root < 0;
258
259 if (inv) {
260 root = -root;
261 }
262
263 if (root === 0) {
264 throw new Error('Root must be non-zero');
265 }
266
267 if (a < 0 && Math.abs(root) % 2 !== 1) {
268 throw new Error('Root must be odd when a is negative.');
269 } // edge cases zero and infinity
270
271
272 if (a === 0) {
273 return inv ? Infinity : 0;
274 }
275
276 if (!isFinite(a)) {
277 return inv ? 0 : a;
278 }
279
280 var x = Math.pow(Math.abs(a), 1 / root); // If a < 0, we require that root is an odd integer,
281 // so (-1) ^ (1/root) = -1
282
283 x = a < 0 ? -x : x;
284 return inv ? 1 / x : x; // Very nice algorithm, but fails with nthRoot(-2, 3).
285 // Newton's method has some well-known problems at times:
286 // https://en.wikipedia.org/wiki/Newton%27s_method#Failure_analysis
287
288 /*
289 let x = 1 // Initial guess
290 let xPrev = 1
291 let i = 0
292 const iMax = 10000
293 do {
294 const delta = (a / Math.pow(x, root - 1) - x) / root
295 xPrev = x
296 x = x + delta
297 i++
298 }
299 while (xPrev !== x && i < iMax)
300 if (xPrev !== x) {
301 throw new Error('Function nthRoot failed to converge')
302 }
303 return inv ? 1 / x : x
304 */
305}
306
307nthRootNumber.signature = n2;
308
309function signNumber(x) {
310 return (0, _number.sign)(x);
311}
312
313signNumber.signature = n1;
314
315function sqrtNumber(x) {
316 return Math.sqrt(x);
317}
318
319sqrtNumber.signature = n1;
320
321function squareNumber(x) {
322 return x * x;
323}
324
325squareNumber.signature = n1;
326/**
327 * Calculate xgcd for two numbers
328 * @param {number} a
329 * @param {number} b
330 * @return {number} result
331 * @private
332 */
333
334function xgcdNumber(a, b) {
335 // source: https://en.wikipedia.org/wiki/Extended_Euclidean_algorithm
336 var t; // used to swap two variables
337
338 var q; // quotient
339
340 var r; // remainder
341
342 var x = 0;
343 var lastx = 1;
344 var y = 1;
345 var lasty = 0;
346
347 if (!(0, _number.isInteger)(a) || !(0, _number.isInteger)(b)) {
348 throw new Error('Parameters in function xgcd must be integer numbers');
349 }
350
351 while (b) {
352 q = Math.floor(a / b);
353 r = a - q * b;
354 t = x;
355 x = lastx - q * x;
356 lastx = t;
357 t = y;
358 y = lasty - q * y;
359 lasty = t;
360 a = b;
361 b = r;
362 }
363
364 var res;
365
366 if (a < 0) {
367 res = [-a, -lastx, -lasty];
368 } else {
369 res = [a, a ? lastx : 0, lasty];
370 }
371
372 return res;
373}
374
375xgcdNumber.signature = n2;
376/**
377 * Calculates the power of x to y, x^y, for two numbers.
378 * @param {number} x
379 * @param {number} y
380 * @return {number} res
381 */
382
383function powNumber(x, y) {
384 // x^Infinity === 0 if -1 < x < 1
385 // A real number 0 is returned instead of complex(0)
386 if (x * x < 1 && y === Infinity || x * x > 1 && y === -Infinity) {
387 return 0;
388 }
389
390 return Math.pow(x, y);
391}
392
393powNumber.signature = n2;
394/**
395 * round a number to the given number of decimals, or to zero if decimals is
396 * not provided
397 * @param {number} value
398 * @param {number} decimals number of decimals, between 0 and 15 (0 by default)
399 * @return {number} roundedValue
400 */
401
402function roundNumber(value) {
403 var decimals = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : 0;
404 return parseFloat((0, _number.toFixed)(value, decimals));
405}
406
407roundNumber.signature = n2;
408/**
409 * Calculate the norm of a number, the absolute value.
410 * @param {number} x
411 * @return {number}
412 */
413
414function normNumber(x) {
415 return Math.abs(x);
416}
417
418normNumber.signature = n1;
\No newline at end of file