PageSourceSearch

https://static.f2pool.com/static/js/decimal.js?v=5ecc27b4f611cfcba…fd34e62a5237cac06d76e7098153c4835192ff9feb4

js f2pool.com collected 2026-10-02 14:54:39 UTC 130,980 bytes, 4,934 lines download raw bytes

1;(function (globalScope) {
2  'use strict';
3
4
5  /*!
6   *  decimal.js v10.4.3
7   *  An arbitrary-precision Decimal type for JavaScript.
8   *  https://github.com/MikeMcl/decimal.js
9   *  Copyright (c) 2022 Michael Mclaughlin <[email protected]>
10   *  MIT Licence
11   */
12
13
14  // -----------------------------------  EDITABLE DEFAULTS  ------------------------------------ //
15
16
17    // The maximum exponent magnitude.
18    // The limit on the value of `toExpNeg`, `toExpPos`, `minE` and `maxE`.
19  var EXP_LIMIT = 9e15,                      // 0 to 9e15
20
21    // The limit on the value of `precision`, and on the value of the first argument to
22    // `toDecimalPlaces`, `toExponential`, `toFixed`, `toPrecision` and `toSignificantDigits`.
23    MAX_DIGITS = 1e9,                        // 0 to 1e9
24
25    // Base conversion alphabet.
26    NUMERALS = '0123456789abcdef',
27
28    // The natural logarithm of 10 (1025 digits).
29    LN10 = '2.3025850929940456840179914546843642076011014886287729760333279009675726096773524802359972050895982983419677840422862486334095254650828067566662873690987816894829072083255546808437998948262331985283935053089653777326288461633662222876982198867465436674744042432743651550489343149393914796194044002221051017141748003688084012647080685567743216228355220114804663715659121373450747856947683463616792101806445070648000277502684916746550586856935673420670581136429224554405758925724208241314695689016758940256776311356919292033376587141660230105703089634572075440370847469940168269282808481184289314848524948644871927809676271275775397027668605952496716674183485704422507197965004714951050492214776567636938662976979522110718264549734772662425709429322582798502585509785265383207606726317164309505995087807523710333101197857547331541421808427543863591778117054309827482385045648019095610299291824318237525357709750539565187697510374970888692180205189339507238539205144634197265287286965110862571492198849978748873771345686209167058',
30
31    // Pi (1025 digits).
32    PI = '3.1415926535897932384626433832795028841971693993751058209749445923078164062862089986280348253421170679821480865132823066470938446095505822317253594081284811174502841027019385211055596446229489549303819644288109756659334461284756482337867831652712019091456485669234603486104543266482133936072602491412737245870066063155881748815209209628292540917153643678925903600113305305488204665213841469519415116094330572703657595919530921861173819326117931051185480744623799627495673518857527248912279381830119491298336733624406566430860213949463952247371907021798609437027705392171762931767523846748184676694051320005681271452635608277857713427577896091736371787214684409012249534301465495853710507922796892589235420199561121290219608640344181598136297747713099605187072113499999983729780499510597317328160963185950244594553469083026425223082533446850352619311881710100031378387528865875332083814206171776691473035982534904287554687311595628638823537875937519577818577805321712268066130019278766111959092164201989380952572010654858632789',
33
34
35    // The initial configuration properties of the Decimal constructor.
36    DEFAULTS = {
37
38      // These values must be integers within the stated ranges (inclusive).
39      // Most of these values can be changed at run-time using the `Decimal.config` method.
40
41      // The maximum number of significant digits of the result of a calculation or base conversion.
42      // E.g. `Decimal.config({ precision: 20 });`
43      precision: 20,                         // 1 to MAX_DIGITS
44
45      // The rounding mode used when rounding to `precision`.
46      //
47      // ROUND_UP         0 Away from zero.
48      // ROUND_DOWN       1 Towards zero.
49      // ROUND_CEIL       2 Towards +Infinity.
50      // ROUND_FLOOR      3 Towards -Infinity.
51      // ROUND_HALF_UP    4 Towards nearest neighbour. If equidistant, up.
52      // ROUND_HALF_DOWN  5 Towards nearest neighbour. If equidistant, down.
53      // ROUND_HALF_EVEN  6 Towards nearest neighbour. If equidistant, towards even neighbour.
54      // ROUND_HALF_CEIL  7 Towards nearest neighbour. If equidistant, towards +Infinity.
55      // ROUND_HALF_FLOOR 8 Towards nearest neighbour. If equidistant, towards -Infinity.
56      //
57      // E.g.
58      // `Decimal.rounding = 4;`
59      // `Decimal.rounding = Decimal.ROUND_HALF_UP;`
60      rounding: 4,                           // 0 to 8
61
62      // The modulo mode used when calculating the modulus: a mod n.
63      // The quotient (q = a / n) is calculated according to the corresponding rounding mode.
64      // The remainder (r) is calculated as: r = a - n * q.
65      //
66      // UP         0 The remainder is positive if the dividend is negative, else is negative.
67      // DOWN       1 The remainder has the same sign as the dividend (JavaScript %).
68      // FLOOR      3 The remainder has the same sign as the divisor (Python %).
69      // HALF_EVEN  6 The IEEE 754 remainder function.
vendor: 16,033 bytes, lines 70-650
70      // EUCLID     9 Euclidian division. q = sign(n) * floor(a / abs(n)). Always positive.
71      //
72      // Truncated division (1), floored division (3), the IEEE 754 remainder (6), and Euclidian
73      // division (9) are commonly used for the modulus operation. The other rounding modes can also
74      // be used, but they may not give useful results.
75      modulo: 1,                             // 0 to 9
76
77      // The exponent value at and beneath which `toString` returns exponential notation.
78      // JavaScript numbers: -7
79      toExpNeg: -7,                          // 0 to -EXP_LIMIT
80
81      // The exponent value at and above which `toString` returns exponential notation.
82      // JavaScript numbers: 21
83      toExpPos:  21,                         // 0 to EXP_LIMIT
84
85      // The minimum exponent value, beneath which underflow to zero occurs.
86      // JavaScript numbers: -324  (5e-324)
87      minE: -EXP_LIMIT,                      // -1 to -EXP_LIMIT
88
89      // The maximum exponent value, above which overflow to Infinity occurs.
90      // JavaScript numbers: 308  (1.7976931348623157e+308)
91      maxE: EXP_LIMIT,                       // 1 to EXP_LIMIT
92
93      // Whether to use cryptographically-secure random number generation, if available.
94      crypto: false                          // true/false
95    },
96
97
98  // ----------------------------------- END OF EDITABLE DEFAULTS ------------------------------- //
99
100
101    Decimal, inexact, noConflict, quadrant,
102    external = true,
103
104    decimalError = '[DecimalError] ',
105    invalidArgument = decimalError + 'Invalid argument: ',
106    precisionLimitExceeded = decimalError + 'Precision limit exceeded',
107    cryptoUnavailable = decimalError + 'crypto unavailable',
108    tag = '[object Decimal]',
109
110    mathfloor = Math.floor,
111    mathpow = Math.pow,
112
113    isBinary = /^0b([01]+(\.[01]*)?|\.[01]+)(p[+-]?\d+)?$/i,
114    isHex = /^0x([0-9a-f]+(\.[0-9a-f]*)?|\.[0-9a-f]+)(p[+-]?\d+)?$/i,
115    isOctal = /^0o([0-7]+(\.[0-7]*)?|\.[0-7]+)(p[+-]?\d+)?$/i,
116    isDecimal = /^(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i,
117
118    BASE = 1e7,
119    LOG_BASE = 7,
120    MAX_SAFE_INTEGER = 9007199254740991,
121
122    LN10_PRECISION = LN10.length - 1,
123    PI_PRECISION = PI.length - 1,
124
125    // Decimal.prototype object
126    P = { toStringTag: tag };
127
128
129  // Decimal prototype methods
130
131
132  /*
133   *  absoluteValue             abs
134   *  ceil
135   *  clampedTo                 clamp
136   *  comparedTo                cmp
137   *  cosine                    cos
138   *  cubeRoot                  cbrt
139   *  decimalPlaces             dp
140   *  dividedBy                 div
141   *  dividedToIntegerBy        divToInt
142   *  equals                    eq
143   *  floor
144   *  greaterThan               gt
145   *  greaterThanOrEqualTo      gte
146   *  hyperbolicCosine          cosh
147   *  hyperbolicSine            sinh
148   *  hyperbolicTangent         tanh
149   *  inverseCosine             acos
150   *  inverseHyperbolicCosine   acosh
151   *  inverseHyperbolicSine     asinh
152   *  inverseHyperbolicTangent  atanh
153   *  inverseSine               asin
154   *  inverseTangent            atan
155   *  isFinite
156   *  isInteger                 isInt
157   *  isNaN
158   *  isNegative                isNeg
159   *  isPositive                isPos
160   *  isZero
161   *  lessThan                  lt
162   *  lessThanOrEqualTo         lte
163   *  logarithm                 log
164   *  [maximum]                 [max]
165   *  [minimum]                 [min]
166   *  minus                     sub
167   *  modulo                    mod
168   *  naturalExponential        exp
169   *  naturalLogarithm          ln
170   *  negated                   neg
171   *  plus                      add
172   *  precision                 sd
173   *  round
174   *  sine                      sin
175   *  squareRoot                sqrt
176   *  tangent                   tan
177   *  times                     mul
178   *  toBinary
179   *  toDecimalPlaces           toDP
180   *  toExponential
181   *  toFixed
182   *  toFraction
183   *  toHexadecimal             toHex
184   *  toNearest
185   *  toNumber
186   *  toOctal
187   *  toPower                   pow
188   *  toPrecision
189   *  toSignificantDigits       toSD
190   *  toString
191   *  truncated                 trunc
192   *  valueOf                   toJSON
193   */
194
195
196  /*
197   * Return a new Decimal whose value is the absolute value of this Decimal.
198   *
199   */
200  P.absoluteValue = P.abs = function () {
201    var x = new this.constructor(this);
202    if (x.s < 0) x.s = 1;
203    return finalise(x);
204  };
205
206
207  /*
208   * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the
209   * direction of positive Infinity.
210   *
211   */
212  P.ceil = function () {
213    return finalise(new this.constructor(this), this.e + 1, 2);
214  };
215
216
217  /*
218   * Return a new Decimal whose value is the value of this Decimal clamped to the range
219   * delineated by `min` and `max`.
220   *
221   * min {number|string|Decimal}
222   * max {number|string|Decimal}
223   *
224   */
225  P.clampedTo = P.clamp = function (min, max) {
226    var k,
227      x = this,
228      Ctor = x.constructor;
229    min = new Ctor(min);
230    max = new Ctor(max);
231    if (!min.s || !max.s) return new Ctor(NaN);
232    if (min.gt(max)) throw Error(invalidArgument + max);
233    k = x.cmp(min);
234    return k < 0 ? min : x.cmp(max) > 0 ? max : new Ctor(x);
235  };
236
237
238  /*
239   * Return
240   *   1    if the value of this Decimal is greater than the value of `y`,
241   *  -1    if the value of this Decimal is less than the value of `y`,
242   *   0    if they have the same value,
243   *   NaN  if the value of either Decimal is NaN.
244   *
245   */
246  P.comparedTo = P.cmp = function (y) {
247    var i, j, xdL, ydL,
248      x = this,
249      xd = x.d,
250      yd = (y = new x.constructor(y)).d,
251      xs = x.s,
252      ys = y.s;
253
254    // Either NaN or ±Infinity?
255    if (!xd || !yd) {
256      return !xs || !ys ? NaN : xs !== ys ? xs : xd === yd ? 0 : !xd ^ xs < 0 ? 1 : -1;
257    }
258
259    // Either zero?
260    if (!xd[0] || !yd[0]) return xd[0] ? xs : yd[0] ? -ys : 0;
261
262    // Signs differ?
263    if (xs !== ys) return xs;
264
265    // Compare exponents.
266    if (x.e !== y.e) return x.e > y.e ^ xs < 0 ? 1 : -1;
267
268    xdL = xd.length;
269    ydL = yd.length;
270
271    // Compare digit by digit.
272    for (i = 0, j = xdL < ydL ? xdL : ydL; i < j; ++i) {
273      if (xd[i] !== yd[i]) return xd[i] > yd[i] ^ xs < 0 ? 1 : -1;
274    }
275
276    // Compare lengths.
277    return xdL === ydL ? 0 : xdL > ydL ^ xs < 0 ? 1 : -1;
278  };
279
280
281  /*
282   * Return a new Decimal whose value is the cosine of the value in radians of this Decimal.
283   *
284   * Domain: [-Infinity, Infinity]
285   * Range: [-1, 1]
286   *
287   * cos(0)         = 1
288   * cos(-0)        = 1
289   * cos(Infinity)  = NaN
290   * cos(-Infinity) = NaN
291   * cos(NaN)       = NaN
292   *
293   */
294  P.cosine = P.cos = function () {
295    var pr, rm,
296      x = this,
297      Ctor = x.constructor;
298
299    if (!x.d) return new Ctor(NaN);
300
301    // cos(0) = cos(-0) = 1
302    if (!x.d[0]) return new Ctor(1);
303
304    pr = Ctor.precision;
305    rm = Ctor.rounding;
306    Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;
307    Ctor.rounding = 1;
308
309    x = cosine(Ctor, toLessThanHalfPi(Ctor, x));
310
311    Ctor.precision = pr;
312    Ctor.rounding = rm;
313
314    return finalise(quadrant == 2 || quadrant == 3 ? x.neg() : x, pr, rm, true);
315  };
316
317
318  /*
319   *
320   * Return a new Decimal whose value is the cube root of the value of this Decimal, rounded to
321   * `precision` significant digits using rounding mode `rounding`.
322   *
323   *  cbrt(0)  =  0
324   *  cbrt(-0) = -0
325   *  cbrt(1)  =  1
326   *  cbrt(-1) = -1
327   *  cbrt(N)  =  N
328   *  cbrt(-I) = -I
329   *  cbrt(I)  =  I
330   *
331   * Math.cbrt(x) = (x < 0 ? -Math.pow(-x, 1/3) : Math.pow(x, 1/3))
332   *
333   */
334  P.cubeRoot = P.cbrt = function () {
335    var e, m, n, r, rep, s, sd, t, t3, t3plusx,
336      x = this,
337      Ctor = x.constructor;
338
339    if (!x.isFinite() || x.isZero()) return new Ctor(x);
340    external = false;
341
342    // Initial estimate.
343    s = x.s * mathpow(x.s * x, 1 / 3);
344
345     // Math.cbrt underflow/overflow?
346     // Pass x to Math.pow as integer, then adjust the exponent of the result.
347    if (!s || Math.abs(s) == 1 / 0) {
348      n = digitsToString(x.d);
349      e = x.e;
350
351      // Adjust n exponent so it is a multiple of 3 away from x exponent.
352      if (s = (e - n.length + 1) % 3) n += (s == 1 || s == -2 ? '0' : '00');
353      s = mathpow(n, 1 / 3);
354
355      // Rarely, e may be one less than the result exponent value.
356      e = mathfloor((e + 1) / 3) - (e % 3 == (e < 0 ? -1 : 2));
357
358      if (s == 1 / 0) {
359        n = '5e' + e;
360      } else {
361        n = s.toExponential();
362        n = n.slice(0, n.indexOf('e') + 1) + e;
363      }
364
365      r = new Ctor(n);
366      r.s = x.s;
367    } else {
368      r = new Ctor(s.toString());
369    }
370
371    sd = (e = Ctor.precision) + 3;
372
373    // Halley's method.
374    // TODO? Compare Newton's method.
375    for (;;) {
376      t = r;
377      t3 = t.times(t).times(t);
378      t3plusx = t3.plus(x);
379      r = divide(t3plusx.plus(x).times(t), t3plusx.plus(t3), sd + 2, 1);
380
381      // TODO? Replace with for-loop and checkRoundingDigits.
382      if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {
383        n = n.slice(sd - 3, sd + 1);
384
385        // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or 4999
386        // , i.e. approaching a rounding boundary, continue the iteration.
387        if (n == '9999' || !rep && n == '4999') {
388
389          // On the first iteration only, check to see if rounding up gives the exact result as the
390          // nines may infinitely repeat.
391          if (!rep) {
392            finalise(t, e + 1, 0);
393
394            if (t.times(t).times(t).eq(x)) {
395              r = t;
396              break;
397            }
398          }
399
400          sd += 4;
401          rep = 1;
402        } else {
403
404          // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.
405          // If not, then there are further digits and m will be truthy.
406          if (!+n || !+n.slice(1) && n.charAt(0) == '5') {
407
408            // Truncate to the first rounding digit.
409            finalise(r, e + 1, 1);
410            m = !r.times(r).times(r).eq(x);
411          }
412
413          break;
414        }
415      }
416    }
417
418    external = true;
419
420    return finalise(r, e, Ctor.rounding, m);
421  };
422
423
424  /*
425   * Return the number of decimal places of the value of this Decimal.
426   *
427   */
428  P.decimalPlaces = P.dp = function () {
429    var w,
430      d = this.d,
431      n = NaN;
432
433    if (d) {
434      w = d.length - 1;
435      n = (w - mathfloor(this.e / LOG_BASE)) * LOG_BASE;
436
437      // Subtract the number of trailing zeros of the last word.
438      w = d[w];
439      if (w) for (; w % 10 == 0; w /= 10) n--;
440      if (n < 0) n = 0;
441    }
442
443    return n;
444  };
445
446
447  /*
448   *  n / 0 = I
449   *  n / N = N
450   *  n / I = 0
451   *  0 / n = 0
452   *  0 / 0 = N
453   *  0 / N = N
454   *  0 / I = 0
455   *  N / n = N
456   *  N / 0 = N
457   *  N / N = N
458   *  N / I = N
459   *  I / n = I
460   *  I / 0 = I
461   *  I / N = N
462   *  I / I = N
463   *
464   * Return a new Decimal whose value is the value of this Decimal divided by `y`, rounded to
465   * `precision` significant digits using rounding mode `rounding`.
466   *
467   */
468  P.dividedBy = P.div = function (y) {
469    return divide(this, new this.constructor(y));
470  };
471
472
473  /*
474   * Return a new Decimal whose value is the integer part of dividing the value of this Decimal
475   * by the value of `y`, rounded to `precision` significant digits using rounding mode `rounding`.
476   *
477   */
478  P.dividedToIntegerBy = P.divToInt = function (y) {
479    var x = this,
480      Ctor = x.constructor;
481    return finalise(divide(x, new Ctor(y), 0, 1, 1), Ctor.precision, Ctor.rounding);
482  };
483
484
485  /*
486   * Return true if the value of this Decimal is equal to the value of `y`, otherwise return false.
487   *
488   */
489  P.equals = P.eq = function (y) {
490    return this.cmp(y) === 0;
491  };
492
493
494  /*
495   * Return a new Decimal whose value is the value of this Decimal rounded to a whole number in the
496   * direction of negative Infinity.
497   *
498   */
499  P.floor = function () {
500    return finalise(new this.constructor(this), this.e + 1, 3);
501  };
502
503
504  /*
505   * Return true if the value of this Decimal is greater than the value of `y`, otherwise return
506   * false.
507   *
508   */
509  P.greaterThan = P.gt = function (y) {
510    return this.cmp(y) > 0;
511  };
512
513
514  /*
515   * Return true if the value of this Decimal is greater than or equal to the value of `y`,
516   * otherwise return false.
517   *
518   */
519  P.greaterThanOrEqualTo = P.gte = function (y) {
520    var k = this.cmp(y);
521    return k == 1 || k === 0;
522  };
523
524
525  /*
526   * Return a new Decimal whose value is the hyperbolic cosine of the value in radians of this
527   * Decimal.
528   *
529   * Domain: [-Infinity, Infinity]
530   * Range: [1, Infinity]
531   *
532   * cosh(x) = 1 + x^2/2! + x^4/4! + x^6/6! + ...
533   *
534   * cosh(0)         = 1
535   * cosh(-0)        = 1
536   * cosh(Infinity)  = Infinity
537   * cosh(-Infinity) = Infinity
538   * cosh(NaN)       = NaN
539   *
540   *  x        time taken (ms)   result
541   * 1000      9                 9.8503555700852349694e+433
542   * 10000     25                4.4034091128314607936e+4342
543   * 100000    171               1.4033316802130615897e+43429
544   * 1000000   3817              1.5166076984010437725e+434294
545   * 10000000  abandoned after 2 minute wait
546   *
547   * TODO? Compare performance of cosh(x) = 0.5 * (exp(x) + exp(-x))
548   *
549   */
550  P.hyperbolicCosine = P.cosh = function () {
551    var k, n, pr, rm, len,
552      x = this,
553      Ctor = x.constructor,
554      one = new Ctor(1);
555
556    if (!x.isFinite()) return new Ctor(x.s ? 1 / 0 : NaN);
557    if (x.isZero()) return one;
558
559    pr = Ctor.precision;
560    rm = Ctor.rounding;
561    Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;
562    Ctor.rounding = 1;
563    len = x.d.length;
564
565    // Argument reduction: cos(4x) = 1 - 8cos^2(x) + 8cos^4(x) + 1
566    // i.e. cos(x) = 1 - cos^2(x/4)(8 - 8cos^2(x/4))
567
568    // Estimate the optimum number of times to use the argument reduction.
569    // TODO? Estimation reused from cosine() and may not be optimal here.
570    if (len < 32) {
571      k = Math.ceil(len / 3);
572      n = (1 / tinyPow(4, k)).toString();
573    } else {
574      k = 16;
575      n = '2.3283064365386962890625e-10';
576    }
577
578    x = taylorSeries(Ctor, 1, x.times(n), new Ctor(1), true);
579
580    // Reverse argument reduction
581    var cosh2_x,
582      i = k,
583      d8 = new Ctor(8);
584    for (; i--;) {
585      cosh2_x = x.times(x);
586      x = one.minus(cosh2_x.times(d8.minus(cosh2_x.times(d8))));
587    }
588
589    return finalise(x, Ctor.precision = pr, Ctor.rounding = rm, true);
590  };
591
592
593  /*
594   * Return a new Decimal whose value is the hyperbolic sine of the value in radians of this
595   * Decimal.
596   *
597   * Domain: [-Infinity, Infinity]
598   * Range: [-Infinity, Infinity]
599   *
600   * sinh(x) = x + x^3/3! + x^5/5! + x^7/7! + ...
601   *
602   * sinh(0)         = 0
603   * sinh(-0)        = -0
604   * sinh(Infinity)  = Infinity
605   * sinh(-Infinity) = -Infinity
606   * sinh(NaN)       = NaN
607   *
608   * x        time taken (ms)
609   * 10       2 ms
610   * 100      5 ms
611   * 1000     14 ms
612   * 10000    82 ms
613   * 100000   886 ms            1.4033316802130615897e+43429
614   * 200000   2613 ms
615   * 300000   5407 ms
616   * 400000   8824 ms
617   * 500000   13026 ms          8.7080643612718084129e+217146
618   * 1000000  48543 ms
619   *
620   * TODO? Compare performance of sinh(x) = 0.5 * (exp(x) - exp(-x))
621   *
622   */
623  P.hyperbolicSine = P.sinh = function () {
624    var k, pr, rm, len,
625      x = this,
626      Ctor = x.constructor;
627
628    if (!x.isFinite() || x.isZero()) return new Ctor(x);
629
630    pr = Ctor.precision;
631    rm = Ctor.rounding;
632    Ctor.precision = pr + Math.max(x.e, x.sd()) + 4;
633    Ctor.rounding = 1;
634    len = x.d.length;
635
636    if (len < 3) {
637      x = taylorSeries(Ctor, 2, x, x, true);
638    } else {
639
640      // Alternative argument reduction: sinh(3x) = sinh(x)(3 + 4sinh^2(x))
641      // i.e. sinh(x) = sinh(x/3)(3 + 4sinh^2(x/3))
642      // 3 multiplications and 1 addition
643
644      // Argument reduction: sinh(5x) = sinh(x)(5 + sinh^2(x)(20 + 16sinh^2(x)))
645      // i.e. sinh(x) = sinh(x/5)(5 + sinh^2(x/5)(20 + 16sinh^2(x/5)))
646      // 4 multiplications and 2 additions
647
648      // Estimate the optimum number of times to use the argument reduction.
649      k = 1.4 * Math.sqrt(len);
650      k = k >
vendor: 6,285 bytes, lines 650-931
650 16 ? 16 : k | 0;
651
652      x = x.times(1 / tinyPow(5, k));
653      x = taylorSeries(Ctor, 2, x, x, true);
654
655      // Reverse argument reduction
656      var sinh2_x,
657        d5 = new Ctor(5),
658        d16 = new Ctor(16),
659        d20 = new Ctor(20);
660      for (; k--;) {
661        sinh2_x = x.times(x);
662        x = x.times(d5.plus(sinh2_x.times(d16.times(sinh2_x).plus(d20))));
663      }
664    }
665
666    Ctor.precision = pr;
667    Ctor.rounding = rm;
668
669    return finalise(x, pr, rm, true);
670  };
671
672
673  /*
674   * Return a new Decimal whose value is the hyperbolic tangent of the value in radians of this
675   * Decimal.
676   *
677   * Domain: [-Infinity, Infinity]
678   * Range: [-1, 1]
679   *
680   * tanh(x) = sinh(x) / cosh(x)
681   *
682   * tanh(0)         = 0
683   * tanh(-0)        = -0
684   * tanh(Infinity)  = 1
685   * tanh(-Infinity) = -1
686   * tanh(NaN)       = NaN
687   *
688   */
689  P.hyperbolicTangent = P.tanh = function () {
690    var pr, rm,
691      x = this,
692      Ctor = x.constructor;
693
694    if (!x.isFinite()) return new Ctor(x.s);
695    if (x.isZero()) return new Ctor(x);
696
697    pr = Ctor.precision;
698    rm = Ctor.rounding;
699    Ctor.precision = pr + 7;
700    Ctor.rounding = 1;
701
702    return divide(x.sinh(), x.cosh(), Ctor.precision = pr, Ctor.rounding = rm);
703  };
704
705
706  /*
707   * Return a new Decimal whose value is the arccosine (inverse cosine) in radians of the value of
708   * this Decimal.
709   *
710   * Domain: [-1, 1]
711   * Range: [0, pi]
712   *
713   * acos(x) = pi/2 - asin(x)
714   *
715   * acos(0)       = pi/2
716   * acos(-0)      = pi/2
717   * acos(1)       = 0
718   * acos(-1)      = pi
719   * acos(1/2)     = pi/3
720   * acos(-1/2)    = 2*pi/3
721   * acos(|x| > 1) = NaN
722   * acos(NaN)     = NaN
723   *
724   */
725  P.inverseCosine = P.acos = function () {
726    var halfPi,
727      x = this,
728      Ctor = x.constructor,
729      k = x.abs().cmp(1),
730      pr = Ctor.precision,
731      rm = Ctor.rounding;
732
733    if (k !== -1) {
734      return k === 0
735        // |x| is 1
736        ? x.isNeg() ? getPi(Ctor, pr, rm) : new Ctor(0)
737        // |x| > 1 or x is NaN
738        : new Ctor(NaN);
739    }
740
741    if (x.isZero()) return getPi(Ctor, pr + 4, rm).times(0.5);
742
743    // TODO? Special case acos(0.5) = pi/3 and acos(-0.5) = 2*pi/3
744
745    Ctor.precision = pr + 6;
746    Ctor.rounding = 1;
747
748    x = x.asin();
749    halfPi = getPi(Ctor, pr + 4, rm).times(0.5);
750
751    Ctor.precision = pr;
752    Ctor.rounding = rm;
753
754    return halfPi.minus(x);
755  };
756
757
758  /*
759   * Return a new Decimal whose value is the inverse of the hyperbolic cosine in radians of the
760   * value of this Decimal.
761   *
762   * Domain: [1, Infinity]
763   * Range: [0, Infinity]
764   *
765   * acosh(x) = ln(x + sqrt(x^2 - 1))
766   *
767   * acosh(x < 1)     = NaN
768   * acosh(NaN)       = NaN
769   * acosh(Infinity)  = Infinity
770   * acosh(-Infinity) = NaN
771   * acosh(0)         = NaN
772   * acosh(-0)        = NaN
773   * acosh(1)         = 0
774   * acosh(-1)        = NaN
775   *
776   */
777  P.inverseHyperbolicCosine = P.acosh = function () {
778    var pr, rm,
779      x = this,
780      Ctor = x.constructor;
781
782    if (x.lte(1)) return new Ctor(x.eq(1) ? 0 : NaN);
783    if (!x.isFinite()) return new Ctor(x);
784
785    pr = Ctor.precision;
786    rm = Ctor.rounding;
787    Ctor.precision = pr + Math.max(Math.abs(x.e), x.sd()) + 4;
788    Ctor.rounding = 1;
789    external = false;
790
791    x = x.times(x).minus(1).sqrt().plus(x);
792
793    external = true;
794    Ctor.precision = pr;
795    Ctor.rounding = rm;
796
797    return x.ln();
798  };
799
800
801  /*
802   * Return a new Decimal whose value is the inverse of the hyperbolic sine in radians of the value
803   * of this Decimal.
804   *
805   * Domain: [-Infinity, Infinity]
806   * Range: [-Infinity, Infinity]
807   *
808   * asinh(x) = ln(x + sqrt(x^2 + 1))
809   *
810   * asinh(NaN)       = NaN
811   * asinh(Infinity)  = Infinity
812   * asinh(-Infinity) = -Infinity
813   * asinh(0)         = 0
814   * asinh(-0)        = -0
815   *
816   */
817  P.inverseHyperbolicSine = P.asinh = function () {
818    var pr, rm,
819      x = this,
820      Ctor = x.constructor;
821
822    if (!x.isFinite() || x.isZero()) return new Ctor(x);
823
824    pr = Ctor.precision;
825    rm = Ctor.rounding;
826    Ctor.precision = pr + 2 * Math.max(Math.abs(x.e), x.sd()) + 6;
827    Ctor.rounding = 1;
828    external = false;
829
830    x = x.times(x).plus(1).sqrt().plus(x);
831
832    external = true;
833    Ctor.precision = pr;
834    Ctor.rounding = rm;
835
836    return x.ln();
837  };
838
839
840  /*
841   * Return a new Decimal whose value is the inverse of the hyperbolic tangent in radians of the
842   * value of this Decimal.
843   *
844   * Domain: [-1, 1]
845   * Range: [-Infinity, Infinity]
846   *
847   * atanh(x) = 0.5 * ln((1 + x) / (1 - x))
848   *
849   * atanh(|x| > 1)   = NaN
850   * atanh(NaN)       = NaN
851   * atanh(Infinity)  = NaN
852   * atanh(-Infinity) = NaN
853   * atanh(0)         = 0
854   * atanh(-0)        = -0
855   * atanh(1)         = Infinity
856   * atanh(-1)        = -Infinity
857   *
858   */
859  P.inverseHyperbolicTangent = P.atanh = function () {
860    var pr, rm, wpr, xsd,
861      x = this,
862      Ctor = x.constructor;
863
864    if (!x.isFinite()) return new Ctor(NaN);
865    if (x.e >= 0) return new Ctor(x.abs().eq(1) ? x.s / 0 : x.isZero() ? x : NaN);
866
867    pr = Ctor.precision;
868    rm = Ctor.rounding;
869    xsd = x.sd();
870
871    if (Math.max(xsd, pr) < 2 * -x.e - 1) return finalise(new Ctor(x), pr, rm, true);
872
873    Ctor.precision = wpr = xsd - x.e;
874
875    x = divide(x.plus(1), new Ctor(1).minus(x), wpr + pr, 1);
876
877    Ctor.precision = pr + 4;
878    Ctor.rounding = 1;
879
880    x = x.ln();
881
882    Ctor.precision = pr;
883    Ctor.rounding = rm;
884
885    return x.times(0.5);
886  };
887
888
889  /*
890   * Return a new Decimal whose value is the arcsine (inverse sine) in radians of the value of this
891   * Decimal.
892   *
893   * Domain: [-Infinity, Infinity]
894   * Range: [-pi/2, pi/2]
895   *
896   * asin(x) = 2*atan(x/(1 + sqrt(1 - x^2)))
897   *
898   * asin(0)       = 0
899   * asin(-0)      = -0
900   * asin(1/2)     = pi/6
901   * asin(-1/2)    = -pi/6
902   * asin(1)       = pi/2
903   * asin(-1)      = -pi/2
904   * asin(|x| > 1) = NaN
905   * asin(NaN)     = NaN
906   *
907   * TODO? Compare performance of Taylor series.
908   *
909   */
910  P.inverseSine = P.asin = function () {
911    var halfPi, k,
912      pr, rm,
913      x = this,
914      Ctor = x.constructor;
915
916    if (x.isZero()) return new Ctor(x);
917
918    k = x.abs().cmp(1);
919    pr = Ctor.precision;
920    rm = Ctor.rounding;
921
922    if (k !== -1) {
923
924      // |x| is 1
925      if (k === 0) {
926        halfPi = getPi(Ctor, pr + 4, rm).times(0.5);
927        halfPi.s = x.s;
928        return halfPi;
929      }
930
931      // |x| >
vendor: 3,766 bytes, lines 931-1102
931 1 or x is NaN
932      return new Ctor(NaN);
933    }
934
935    // TODO? Special case asin(1/2) = pi/6 and asin(-1/2) = -pi/6
936
937    Ctor.precision = pr + 6;
938    Ctor.rounding = 1;
939
940    x = x.div(new Ctor(1).minus(x.times(x)).sqrt().plus(1)).atan();
941
942    Ctor.precision = pr;
943    Ctor.rounding = rm;
944
945    return x.times(2);
946  };
947
948
949  /*
950   * Return a new Decimal whose value is the arctangent (inverse tangent) in radians of the value
951   * of this Decimal.
952   *
953   * Domain: [-Infinity, Infinity]
954   * Range: [-pi/2, pi/2]
955   *
956   * atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...
957   *
958   * atan(0)         = 0
959   * atan(-0)        = -0
960   * atan(1)         = pi/4
961   * atan(-1)        = -pi/4
962   * atan(Infinity)  = pi/2
963   * atan(-Infinity) = -pi/2
964   * atan(NaN)       = NaN
965   *
966   */
967  P.inverseTangent = P.atan = function () {
968    var i, j, k, n, px, t, r, wpr, x2,
969      x = this,
970      Ctor = x.constructor,
971      pr = Ctor.precision,
972      rm = Ctor.rounding;
973
974    if (!x.isFinite()) {
975      if (!x.s) return new Ctor(NaN);
976      if (pr + 4 <= PI_PRECISION) {
977        r = getPi(Ctor, pr + 4, rm).times(0.5);
978        r.s = x.s;
979        return r;
980      }
981    } else if (x.isZero()) {
982      return new Ctor(x);
983    } else if (x.abs().eq(1) && pr + 4 <= PI_PRECISION) {
984      r = getPi(Ctor, pr + 4, rm).times(0.25);
985      r.s = x.s;
986      return r;
987    }
988
989    Ctor.precision = wpr = pr + 10;
990    Ctor.rounding = 1;
991
992    // TODO? if (x >= 1 && pr <= PI_PRECISION) atan(x) = halfPi * x.s - atan(1 / x);
993
994    // Argument reduction
995    // Ensure |x| < 0.42
996    // atan(x) = 2 * atan(x / (1 + sqrt(1 + x^2)))
997
998    k = Math.min(28, wpr / LOG_BASE + 2 | 0);
999
1000    for (i = k; i; --i) x = x.div(x.times(x).plus(1).sqrt().plus(1));
1001
1002    external = false;
1003
1004    j = Math.ceil(wpr / LOG_BASE);
1005    n = 1;
1006    x2 = x.times(x);
1007    r = new Ctor(x);
1008    px = x;
1009
1010    // atan(x) = x - x^3/3 + x^5/5 - x^7/7 + ...
1011    for (; i !== -1;) {
1012      px = px.times(x2);
1013      t = r.minus(px.div(n += 2));
1014
1015      px = px.times(x2);
1016      r = t.plus(px.div(n += 2));
1017
1018      if (r.d[j] !== void 0) for (i = j; r.d[i] === t.d[i] && i--;);
1019    }
1020
1021    if (k) r = r.times(2 << (k - 1));
1022
1023    external = true;
1024
1025    return finalise(r, Ctor.precision = pr, Ctor.rounding = rm, true);
1026  };
1027
1028
1029  /*
1030   * Return true if the value of this Decimal is a finite number, otherwise return false.
1031   *
1032   */
1033  P.isFinite = function () {
1034    return !!this.d;
1035  };
1036
1037
1038  /*
1039   * Return true if the value of this Decimal is an integer, otherwise return false.
1040   *
1041   */
1042  P.isInteger = P.isInt = function () {
1043    return !!this.d && mathfloor(this.e / LOG_BASE) > this.d.length - 2;
1044  };
1045
1046
1047  /*
1048   * Return true if the value of this Decimal is NaN, otherwise return false.
1049   *
1050   */
1051  P.isNaN = function () {
1052    return !this.s;
1053  };
1054
1055
1056  /*
1057   * Return true if the value of this Decimal is negative, otherwise return false.
1058   *
1059   */
1060  P.isNegative = P.isNeg = function () {
1061    return this.s < 0;
1062  };
1063
1064
1065  /*
1066   * Return true if the value of this Decimal is positive, otherwise return false.
1067   *
1068   */
1069  P.isPositive = P.isPos = function () {
1070    return this.s > 0;
1071  };
1072
1073
1074  /*
1075   * Return true if the value of this Decimal is 0 or -0, otherwise return false.
1076   *
1077   */
1078  P.isZero = function () {
1079    return !!this.d && this.d[0] === 0;
1080  };
1081
1082
1083  /*
1084   * Return true if the value of this Decimal is less than `y`, otherwise return false.
1085   *
1086   */
1087  P.lessThan = P.lt = function (y) {
1088    return this.cmp(y) < 0;
1089  };
1090
1091
1092  /*
1093   * Return true if the value of this Decimal is less than or equal to `y`, otherwise return false.
1094   *
1095   */
1096  P.lessThanOrEqualTo = P.lte = function (y) {
1097    return this.cmp(y) < 1;
1098  };
1099
1100
1101  /*
1102   * Return the logarithm of the value of this Decimal to the specified base, rounded to `precision`
1103   * significant digits using rounding mode `rounding`.
1104   *
1105   * If no base is specified, return log[10](arg).
1106   *
1107   * log[base](arg) = ln(arg) / ln(base)
1108   *
1109   * The result will always be correctly rounded if the base of the log is 10, and 'almost always'
1110   * otherwise:
1111   *
1112   * Depending on the rounding mode, the result may be incorrectly rounded if the first fifteen
1113   * rounding digits are [49]99999999999999 or [50]00000000000000. In that case, the maximum error
1114   * between the result and the correctly rounded result will be one ulp (unit in the last place).
1115   *
1116   * log[-b](a)       = NaN
1117   * log[0](a)        = NaN
1118   * log[1](a)        = NaN
1119   * log[NaN](a)      = NaN
1120   * log[Infinity](a) = NaN
1121   * log[b](0)        = -Infinity
1122   * log[b](-0)       = -Infinity
1123   * log[b](-a)       = NaN
1124   * log[b](1)        = 0
1125   * log[b](Infinity) = Infinity
1126   * log[b](NaN)      = NaN
1127   *
1128   * [base] {number|string|Decimal} The base of the logarithm.
1129   *
1130   */
1131  P.logarithm = P.log = function (base) {
1132    var isBase10, d, denominator, k, inf, num, sd, r,
1133      arg = this,
1134      Ctor = arg.constructor,
1135      pr = Ctor.precision,
1136      rm = Ctor.rounding,
1137      guard = 5;
1138
1139    // Default base is 10.
1140    if (base == null) {
1141      base = new Ctor(10);
1142      isBase10 = true;
1143    } else {
1144      base = new Ctor(base);
1145      d = base.d;
1146
1147      // Return NaN if base is negative, or non-finite, or is 0 or 1.
1148      if (base.s < 0 || !d || !d[0] || base.eq(1)) return new Ctor(NaN);
1149
1150      isBase10 = base.eq(10);
1151    }
1152
1153    d = arg.d;
1154
1155    // Is arg negative, non-finite, 0 or 1?
1156    if (arg.s < 0 || !d || !d[0] || arg.eq(1)) {
1157      return new Ctor(d && !d[0] ? -1 / 0 : arg.s != 1 ? NaN : d ? 0 : 1 / 0);
1158    }
1159
1160    // The result will have a non-terminating decimal expansion if base is 10 and arg is not an
1161    // integer power of 10.
1162    if (isBase10) {
1163      if (d.length > 1) {
1164        inf = true;
1165      } else {
1166        for (k = d[0]; k % 10 === 0;) k /= 10;
1167        inf = k !== 1;
1168      }
1169    }
1170
1171    external = false;
1172    sd = pr + guard;
1173    num = naturalLogarithm(arg, sd);
1174    denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);
1175
1176    // The result will have 5 rounding digits.
1177    r = divide(num, denominator, sd, 1);
1178
1179    // If at a rounding boundary, i.e. the result's rounding digits are [49]9999 or [50]0000,
1180    // calculate 10 further digits.
1181    //
1182    // If the result is known to have an infinite decimal expansion, repeat this until it is clear
1183    // that the result is above or below the boundary. Otherwise, if after calculating the 10
1184    // further digits, the last 14 are nines, round up and assume the result is exact.
1185    // Also assume the result is exact if the last 14 are zero.
1186    //
1187    // Example of a result that will be incorrectly rounded:
1188    // log[1048576](4503599627370502) = 2.60000000000000009610279511444746...
1189    // The above result correctly rounded using ROUND_CEIL to 1 decimal place should be 2.7, but it
1190    // will be given as 2.6 as there are 15 zeros immediately after the requested decimal place, so
1191    // the exact result would be assumed to be 2.6, which rounded using ROUND_CEIL to 1 decimal
1192    // place is still 2.6.
1193    if (checkRoundingDigits(r.d, k = pr, rm)) {
1194
1195      do {
1196        sd += 10;
1197        num = naturalLogarithm(arg, sd);
1198        denominator = isBase10 ? getLn10(Ctor, sd + 10) : naturalLogarithm(base, sd);
1199        r = divide(num, denominator, sd, 1);
1200
1201        if (!inf) {
1202
1203          // Check for 14 nines from the 2nd rounding digit, as the first may be 4.
1204          if (+digitsToString(r.d).slice(k + 1, k + 15) + 1 == 1e14) {
1205            r = finalise(r, pr + 1, 0);
1206          }
1207
1208          break;
1209        }
1210      } while (checkRoundingDigits(r.d, k += 10, rm));
1211    }
1212
1213    external = true;
1214
1215    return finalise(r, pr, rm);
1216  };
1217
1218
1219  /*
1220   * Return a new Decimal whose value is the maximum of the arguments and the value of this Decimal.
1221   *
1222   * arguments {number|string|Decimal}
1223   *
1224  P.max = function () {
1225    Array.prototype.push.call(arguments, this);
1226    return maxOrMin(this.constructor, arguments, 'lt');
1227  };
1228   */
1229
1230
1231  /*
1232   * Return a new Decimal whose value is the minimum of the arguments and the value of this Decimal.
1233   *
1234   * arguments {number|string|Decimal}
1235   *
1236  P.min = function () {
1237    Array.prototype.push.call(arguments, this);
1238    return maxOrMin(this.constructor, arguments, 'gt');
1239  };
1240   */
1241
1242
1243  /*
1244   *  n - 0 = n
1245   *  n - N = N
vendor: 5,371 bytes, lines 1246-1476
1246   *  n - I = -I
1247   *  0 - n = -n
1248   *  0 - 0 = 0
1249   *  0 - N = N
1250   *  0 - I = -I
1251   *  N - n = N
1252   *  N - 0 = N
1253   *  N - N = N
1254   *  N - I = N
1255   *  I - n = I
1256   *  I - 0 = I
1257   *  I - N = N
1258   *  I - I = N
1259   *
1260   * Return a new Decimal whose value is the value of this Decimal minus `y`, rounded to `precision`
1261   * significant digits using rounding mode `rounding`.
1262   *
1263   */
1264  P.minus = P.sub = function (y) {
1265    var d, e, i, j, k, len, pr, rm, xd, xe, xLTy, yd,
1266      x = this,
1267      Ctor = x.constructor;
1268
1269    y = new Ctor(y);
1270
1271    // If either is not finite...
1272    if (!x.d || !y.d) {
1273
1274      // Return NaN if either is NaN.
1275      if (!x.s || !y.s) y = new Ctor(NaN);
1276
1277      // Return y negated if x is finite and y is ±Infinity.
1278      else if (x.d) y.s = -y.s;
1279
1280      // Return x if y is finite and x is ±Infinity.
1281      // Return x if both are ±Infinity with different signs.
1282      // Return NaN if both are ±Infinity with the same sign.
1283      else y = new Ctor(y.d || x.s !== y.s ? x : NaN);
1284
1285      return y;
1286    }
1287
1288    // If signs differ...
1289    if (x.s != y.s) {
1290      y.s = -y.s;
1291      return x.plus(y);
1292    }
1293
1294    xd = x.d;
1295    yd = y.d;
1296    pr = Ctor.precision;
1297    rm = Ctor.rounding;
1298
1299    // If either is zero...
1300    if (!xd[0] || !yd[0]) {
1301
1302      // Return y negated if x is zero and y is non-zero.
1303      if (yd[0]) y.s = -y.s;
1304
1305      // Return x if y is zero and x is non-zero.
1306      else if (xd[0]) y = new Ctor(x);
1307
1308      // Return zero if both are zero.
1309      // From IEEE 754 (2008) 6.3: 0 - 0 = -0 - -0 = -0 when rounding to -Infinity.
1310      else return new Ctor(rm === 3 ? -0 : 0);
1311
1312      return external ? finalise(y, pr, rm) : y;
1313    }
1314
1315    // x and y are finite, non-zero numbers with the same sign.
1316
1317    // Calculate base 1e7 exponents.
1318    e = mathfloor(y.e / LOG_BASE);
1319    xe = mathfloor(x.e / LOG_BASE);
1320
1321    xd = xd.slice();
1322    k = xe - e;
1323
1324    // If base 1e7 exponents differ...
1325    if (k) {
1326      xLTy = k < 0;
1327
1328      if (xLTy) {
1329        d = xd;
1330        k = -k;
1331        len = yd.length;
1332      } else {
1333        d = yd;
1334        e = xe;
1335        len = xd.length;
1336      }
1337
1338      // Numbers with massively different exponents would result in a very high number of
1339      // zeros needing to be prepended, but this can be avoided while still ensuring correct
1340      // rounding by limiting the number of zeros to `Math.ceil(pr / LOG_BASE) + 2`.
1341      i = Math.max(Math.ceil(pr / LOG_BASE), len) + 2;
1342
1343      if (k > i) {
1344        k = i;
1345        d.length = 1;
1346      }
1347
1348      // Prepend zeros to equalise exponents.
1349      d.reverse();
1350      for (i = k; i--;) d.push(0);
1351      d.reverse();
1352
1353    // Base 1e7 exponents equal.
1354    } else {
1355
1356      // Check digits to determine which is the bigger number.
1357
1358      i = xd.length;
1359      len = yd.length;
1360      xLTy = i < len;
1361      if (xLTy) len = i;
1362
1363      for (i = 0; i < len; i++) {
1364        if (xd[i] != yd[i]) {
1365          xLTy = xd[i] < yd[i];
1366          break;
1367        }
1368      }
1369
1370      k = 0;
1371    }
1372
1373    if (xLTy) {
1374      d = xd;
1375      xd = yd;
1376      yd = d;
1377      y.s = -y.s;
1378    }
1379
1380    len = xd.length;
1381
1382    // Append zeros to `xd` if shorter.
1383    // Don't add zeros to `yd` if shorter as subtraction only needs to start at `yd` length.
1384    for (i = yd.length - len; i > 0; --i) xd[len++] = 0;
1385
1386    // Subtract yd from xd.
1387    for (i = yd.length; i > k;) {
1388
1389      if (xd[--i] < yd[i]) {
1390        for (j = i; j && xd[--j] === 0;) xd[j] = BASE - 1;
1391        --xd[j];
1392        xd[i] += BASE;
1393      }
1394
1395      xd[i] -= yd[i];
1396    }
1397
1398    // Remove trailing zeros.
1399    for (; xd[--len] === 0;) xd.pop();
1400
1401    // Remove leading zeros and adjust exponent accordingly.
1402    for (; xd[0] === 0; xd.shift()) --e;
1403
1404    // Zero?
1405    if (!xd[0]) return new Ctor(rm === 3 ? -0 : 0);
1406
1407    y.d = xd;
1408    y.e = getBase10Exponent(xd, e);
1409
1410    return external ? finalise(y, pr, rm) : y;
1411  };
1412
1413
1414  /*
1415   *   n % 0 =  N
1416   *   n % N =  N
1417   *   n % I =  n
1418   *   0 % n =  0
1419   *  -0 % n = -0
1420   *   0 % 0 =  N
1421   *   0 % N =  N
1422   *   0 % I =  0
1423   *   N % n =  N
1424   *   N % 0 =  N
1425   *   N % N =  N
1426   *   N % I =  N
1427   *   I % n =  N
1428   *   I % 0 =  N
1429   *   I % N =  N
1430   *   I % I =  N
1431   *
1432   * Return a new Decimal whose value is the value of this Decimal modulo `y`, rounded to
1433   * `precision` significant digits using rounding mode `rounding`.
1434   *
1435   * The result depends on the modulo mode.
1436   *
1437   */
1438  P.modulo = P.mod = function (y) {
1439    var q,
1440      x = this,
1441      Ctor = x.constructor;
1442
1443    y = new Ctor(y);
1444
1445    // Return NaN if x is ±Infinity or NaN, or y is NaN or ±0.
1446    if (!x.d || !y.s || y.d && !y.d[0]) return new Ctor(NaN);
1447
1448    // Return x if y is ±Infinity or x is ±0.
1449    if (!y.d || x.d && !x.d[0]) {
1450      return finalise(new Ctor(x), Ctor.precision, Ctor.rounding);
1451    }
1452
1453    // Prevent rounding of intermediate calculations.
1454    external = false;
1455
1456    if (Ctor.modulo == 9) {
1457
1458      // Euclidian division: q = sign(y) * floor(x / abs(y))
1459      // result = x - q * y    where  0 <= result < abs(y)
1460      q = divide(x, y.abs(), 0, 3, 1);
1461      q.s *= y.s;
1462    } else {
1463      q = divide(x, y, 0, Ctor.modulo, 1);
1464    }
1465
1466    q = q.times(y);
1467
1468    external = true;
1469
1470    return x.minus(q);
1471  };
1472
1473
1474  /*
1475   * Return a new Decimal whose value is the natural exponential of the value of this Decimal,
1476   * i.e. the base e raised to the power the value of this Decimal, rounded to `precision`
1477   * significant digits using rounding mode `rounding`.
1478   *
1479   */
1480  P.naturalExponential = P.exp = function () {
1481    return naturalExponential(this);
1482  };
1483
1484
1485  /*
1486   * Return a new Decimal whose value is the natural logarithm of the value of this Decimal,
1487   * rounded to `precision` significant digits using rounding mode `rounding`.
1488   *
1489   */
1490  P.naturalLogarithm = P.ln = function () {
1491    return naturalLogarithm(this);
1492  };
1493
1494
1495  /*
1496   * Return a new Decimal whose value is the value of this Decimal negated, i.e. as if multiplied by
1497   * -1.
1498   *
1499   */
1500  P.negated = P.neg = function () {
1501    var x = new this.constructor(this);
1502    x.s = -x.s;
1503    return finalise(x);
1504  };
1505
1506
1507  /*
1508   *  n + 0 = n
1509   *  n + N = N
1510   *  n + I = I
1511   *  0 + n = n
1512   *  0 + 0 = 0
1513   *  0 + N = N
1514   *  0 + I = I
1515   *  N + n = N
1516   *  N + 0 = N
1517   *  N + N = N
1518   *  N + I = N
1519   *  I + n = I
1520   *  I + 0 = I
1521   *  I + N = N
1522   *  I + I = I
1523   *
1524   * Return a new Decimal whose value is the value of this Decimal plus `y`, rounded to `precision`
vendor: 22,577 bytes, lines 1525-2369
1525   * significant digits using rounding mode `rounding`.
1526   *
1527   */
1528  P.plus = P.add = function (y) {
1529    var carry, d, e, i, k, len, pr, rm, xd, yd,
1530      x = this,
1531      Ctor = x.constructor;
1532
1533    y = new Ctor(y);
1534
1535    // If either is not finite...
1536    if (!x.d || !y.d) {
1537
1538      // Return NaN if either is NaN.
1539      if (!x.s || !y.s) y = new Ctor(NaN);
1540
1541      // Return x if y is finite and x is ±Infinity.
1542      // Return x if both are ±Infinity with the same sign.
1543      // Return NaN if both are ±Infinity with different signs.
1544      // Return y if x is finite and y is ±Infinity.
1545      else if (!x.d) y = new Ctor(y.d || x.s === y.s ? x : NaN);
1546
1547      return y;
1548    }
1549
1550     // If signs differ...
1551    if (x.s != y.s) {
1552      y.s = -y.s;
1553      return x.minus(y);
1554    }
1555
1556    xd = x.d;
1557    yd = y.d;
1558    pr = Ctor.precision;
1559    rm = Ctor.rounding;
1560
1561    // If either is zero...
1562    if (!xd[0] || !yd[0]) {
1563
1564      // Return x if y is zero.
1565      // Return y if y is non-zero.
1566      if (!yd[0]) y = new Ctor(x);
1567
1568      return external ? finalise(y, pr, rm) : y;
1569    }
1570
1571    // x and y are finite, non-zero numbers with the same sign.
1572
1573    // Calculate base 1e7 exponents.
1574    k = mathfloor(x.e / LOG_BASE);
1575    e = mathfloor(y.e / LOG_BASE);
1576
1577    xd = xd.slice();
1578    i = k - e;
1579
1580    // If base 1e7 exponents differ...
1581    if (i) {
1582
1583      if (i < 0) {
1584        d = xd;
1585        i = -i;
1586        len = yd.length;
1587      } else {
1588        d = yd;
1589        e = k;
1590        len = xd.length;
1591      }
1592
1593      // Limit number of zeros prepended to max(ceil(pr / LOG_BASE), len) + 1.
1594      k = Math.ceil(pr / LOG_BASE);
1595      len = k > len ? k + 1 : len + 1;
1596
1597      if (i > len) {
1598        i = len;
1599        d.length = 1;
1600      }
1601
1602      // Prepend zeros to equalise exponents. Note: Faster to use reverse then do unshifts.
1603      d.reverse();
1604      for (; i--;) d.push(0);
1605      d.reverse();
1606    }
1607
1608    len = xd.length;
1609    i = yd.length;
1610
1611    // If yd is longer than xd, swap xd and yd so xd points to the longer array.
1612    if (len - i < 0) {
1613      i = len;
1614      d = yd;
1615      yd = xd;
1616      xd = d;
1617    }
1618
1619    // Only start adding at yd.length - 1 as the further digits of xd can be left as they are.
1620    for (carry = 0; i;) {
1621      carry = (xd[--i] = xd[i] + yd[i] + carry) / BASE | 0;
1622      xd[i] %= BASE;
1623    }
1624
1625    if (carry) {
1626      xd.unshift(carry);
1627      ++e;
1628    }
1629
1630    // Remove trailing zeros.
1631    // No need to check for zero, as +x + +y != 0 && -x + -y != 0
1632    for (len = xd.length; xd[--len] == 0;) xd.pop();
1633
1634    y.d = xd;
1635    y.e = getBase10Exponent(xd, e);
1636
1637    return external ? finalise(y, pr, rm) : y;
1638  };
1639
1640
1641  /*
1642   * Return the number of significant digits of the value of this Decimal.
1643   *
1644   * [z] {boolean|number} Whether to count integer-part trailing zeros: true, false, 1 or 0.
1645   *
1646   */
1647  P.precision = P.sd = function (z) {
1648    var k,
1649      x = this;
1650
1651    if (z !== void 0 && z !== !!z && z !== 1 && z !== 0) throw Error(invalidArgument + z);
1652
1653    if (x.d) {
1654      k = getPrecision(x.d);
1655      if (z && x.e + 1 > k) k = x.e + 1;
1656    } else {
1657      k = NaN;
1658    }
1659
1660    return k;
1661  };
1662
1663
1664  /*
1665   * Return a new Decimal whose value is the value of this Decimal rounded to a whole number using
1666   * rounding mode `rounding`.
1667   *
1668   */
1669  P.round = function () {
1670    var x = this,
1671      Ctor = x.constructor;
1672
1673    return finalise(new Ctor(x), x.e + 1, Ctor.rounding);
1674  };
1675
1676
1677  /*
1678   * Return a new Decimal whose value is the sine of the value in radians of this Decimal.
1679   *
1680   * Domain: [-Infinity, Infinity]
1681   * Range: [-1, 1]
1682   *
1683   * sin(x) = x - x^3/3! + x^5/5! - ...
1684   *
1685   * sin(0)         = 0
1686   * sin(-0)        = -0
1687   * sin(Infinity)  = NaN
1688   * sin(-Infinity) = NaN
1689   * sin(NaN)       = NaN
1690   *
1691   */
1692  P.sine = P.sin = function () {
1693    var pr, rm,
1694      x = this,
1695      Ctor = x.constructor;
1696
1697    if (!x.isFinite()) return new Ctor(NaN);
1698    if (x.isZero()) return new Ctor(x);
1699
1700    pr = Ctor.precision;
1701    rm = Ctor.rounding;
1702    Ctor.precision = pr + Math.max(x.e, x.sd()) + LOG_BASE;
1703    Ctor.rounding = 1;
1704
1705    x = sine(Ctor, toLessThanHalfPi(Ctor, x));
1706
1707    Ctor.precision = pr;
1708    Ctor.rounding = rm;
1709
1710    return finalise(quadrant > 2 ? x.neg() : x, pr, rm, true);
1711  };
1712
1713
1714  /*
1715   * Return a new Decimal whose value is the square root of this Decimal, rounded to `precision`
1716   * significant digits using rounding mode `rounding`.
1717   *
1718   *  sqrt(-n) =  N
1719   *  sqrt(N)  =  N
1720   *  sqrt(-I) =  N
1721   *  sqrt(I)  =  I
1722   *  sqrt(0)  =  0
1723   *  sqrt(-0) = -0
1724   *
1725   */
1726  P.squareRoot = P.sqrt = function () {
1727    var m, n, sd, r, rep, t,
1728      x = this,
1729      d = x.d,
1730      e = x.e,
1731      s = x.s,
1732      Ctor = x.constructor;
1733
1734    // Negative/NaN/Infinity/zero?
1735    if (s !== 1 || !d || !d[0]) {
1736      return new Ctor(!s || s < 0 && (!d || d[0]) ? NaN : d ? x : 1 / 0);
1737    }
1738
1739    external = false;
1740
1741    // Initial estimate.
1742    s = Math.sqrt(+x);
1743
1744    // Math.sqrt underflow/overflow?
1745    // Pass x to Math.sqrt as integer, then adjust the exponent of the result.
1746    if (s == 0 || s == 1 / 0) {
1747      n = digitsToString(d);
1748
1749      if ((n.length + e) % 2 == 0) n += '0';
1750      s = Math.sqrt(n);
1751      e = mathfloor((e + 1) / 2) - (e < 0 || e % 2);
1752
1753      if (s == 1 / 0) {
1754        n = '5e' + e;
1755      } else {
1756        n = s.toExponential();
1757        n = n.slice(0, n.indexOf('e') + 1) + e;
1758      }
1759
1760      r = new Ctor(n);
1761    } else {
1762      r = new Ctor(s.toString());
1763    }
1764
1765    sd = (e = Ctor.precision) + 3;
1766
1767    // Newton-Raphson iteration.
1768    for (;;) {
1769      t = r;
1770      r = t.plus(divide(x, t, sd + 2, 1)).times(0.5);
1771
1772      // TODO? Replace with for-loop and checkRoundingDigits.
1773      if (digitsToString(t.d).slice(0, sd) === (n = digitsToString(r.d)).slice(0, sd)) {
1774        n = n.slice(sd - 3, sd + 1);
1775
1776        // The 4th rounding digit may be in error by -1 so if the 4 rounding digits are 9999 or
1777        // 4999, i.e. approaching a rounding boundary, continue the iteration.
1778        if (n == '9999' || !rep && n == '4999') {
1779
1780          // On the first iteration only, check to see if rounding up gives the exact result as the
1781          // nines may infinitely repeat.
1782          if (!rep) {
1783            finalise(t, e + 1, 0);
1784
1785            if (t.times(t).eq(x)) {
1786              r = t;
1787              break;
1788            }
1789          }
1790
1791          sd += 4;
1792          rep = 1;
1793        } else {
1794
1795          // If the rounding digits are null, 0{0,4} or 50{0,3}, check for an exact result.
1796          // If not, then there are further digits and m will be truthy.
1797          if (!+n || !+n.slice(1) && n.charAt(0) == '5') {
1798
1799            // Truncate to the first rounding digit.
1800            finalise(r, e + 1, 1);
1801            m = !r.times(r).eq(x);
1802          }
1803
1804          break;
1805        }
1806      }
1807    }
1808
1809    external = true;
1810
1811    return finalise(r, e, Ctor.rounding, m);
1812  };
1813
1814
1815  /*
1816   * Return a new Decimal whose value is the tangent of the value in radians of this Decimal.
1817   *
1818   * Domain: [-Infinity, Infinity]
1819   * Range: [-Infinity, Infinity]
1820   *
1821   * tan(0)         = 0
1822   * tan(-0)        = -0
1823   * tan(Infinity)  = NaN
1824   * tan(-Infinity) = NaN
1825   * tan(NaN)       = NaN
1826   *
1827   */
1828  P.tangent = P.tan = function () {
1829    var pr, rm,
1830      x = this,
1831      Ctor = x.constructor;
1832
1833    if (!x.isFinite()) return new Ctor(NaN);
1834    if (x.isZero()) return new Ctor(x);
1835
1836    pr = Ctor.precision;
1837    rm = Ctor.rounding;
1838    Ctor.precision = pr + 10;
1839    Ctor.rounding = 1;
1840
1841    x = x.sin();
1842    x.s = 1;
1843    x = divide(x, new Ctor(1).minus(x.times(x)).sqrt(), pr + 10, 0);
1844
1845    Ctor.precision = pr;
1846    Ctor.rounding = rm;
1847
1848    return finalise(quadrant == 2 || quadrant == 4 ? x.neg() : x, pr, rm, true);
1849  };
1850
1851
1852  /*
1853   *  n * 0 = 0
1854   *  n * N = N
1855   *  n * I = I
1856   *  0 * n = 0
1857   *  0 * 0 = 0
1858   *  0 * N = N
1859   *  0 * I = N
1860   *  N * n = N
1861   *  N * 0 = N
1862   *  N * N = N
1863   *  N * I = N
1864   *  I * n = I
1865   *  I * 0 = N
1866   *  I * N = N
1867   *  I * I = I
1868   *
1869   * Return a new Decimal whose value is this Decimal times `y`, rounded to `precision` significant
1870   * digits using rounding mode `rounding`.
1871   *
1872   */
1873  P.times = P.mul = function (y) {
1874    var carry, e, i, k, r, rL, t, xdL, ydL,
1875      x = this,
1876      Ctor = x.constructor,
1877      xd = x.d,
1878      yd = (y = new Ctor(y)).d;
1879
1880    y.s *= x.s;
1881
1882     // If either is NaN, ±Infinity or ±0...
1883    if (!xd || !xd[0] || !yd || !yd[0]) {
1884
1885      return new Ctor(!y.s || xd && !xd[0] && !yd || yd && !yd[0] && !xd
1886
1887        // Return NaN if either is NaN.
1888        // Return NaN if x is ±0 and y is ±Infinity, or y is ±0 and x is ±Infinity.
1889        ? NaN
1890
1891        // Return ±Infinity if either is ±Infinity.
1892        // Return ±0 if either is ±0.
1893        : !xd || !yd ? y.s / 0 : y.s * 0);
1894    }
1895
1896    e = mathfloor(x.e / LOG_BASE) + mathfloor(y.e / LOG_BASE);
1897    xdL = xd.length;
1898    ydL = yd.length;
1899
1900    // Ensure xd points to the longer array.
1901    if (xdL < ydL) {
1902      r = xd;
1903      xd = yd;
1904      yd = r;
1905      rL = xdL;
1906      xdL = ydL;
1907      ydL = rL;
1908    }
1909
1910    // Initialise the result array with zeros.
1911    r = [];
1912    rL = xdL + ydL;
1913    for (i = rL; i--;) r.push(0);
1914
1915    // Multiply!
1916    for (i = ydL; --i >= 0;) {
1917      carry = 0;
1918      for (k = xdL + i; k > i;) {
1919        t = r[k] + yd[i] * xd[k - i - 1] + carry;
1920        r[k--] = t % BASE | 0;
1921        carry = t / BASE | 0;
1922      }
1923
1924      r[k] = (r[k] + carry) % BASE | 0;
1925    }
1926
1927    // Remove trailing zeros.
1928    for (; !r[--rL];) r.pop();
1929
1930    if (carry) ++e;
1931    else r.shift();
1932
1933    y.d = r;
1934    y.e = getBase10Exponent(r, e);
1935
1936    return external ? finalise(y, Ctor.precision, Ctor.rounding) : y;
1937  };
1938
1939
1940  /*
1941   * Return a string representing the value of this Decimal in base 2, round to `sd` significant
1942   * digits using rounding mode `rm`.
1943   *
1944   * If the optional `sd` argument is present then return binary exponential notation.
1945   *
1946   * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.
1947   * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
1948   *
1949   */
1950  P.toBinary = function (sd, rm) {
1951    return toStringBinary(this, 2, sd, rm);
1952  };
1953
1954
1955  /*
1956   * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `dp`
1957   * decimal places using rounding mode `rm` or `rounding` if `rm` is omitted.
1958   *
1959   * If `dp` is omitted, return a new Decimal whose value is the value of this Decimal.
1960   *
1961   * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.
1962   * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
1963   *
1964   */
1965  P.toDecimalPlaces = P.toDP = function (dp, rm) {
1966    var x = this,
1967      Ctor = x.constructor;
1968
1969    x = new Ctor(x);
1970    if (dp === void 0) return x;
1971
1972    checkInt32(dp, 0, MAX_DIGITS);
1973
1974    if (rm === void 0) rm = Ctor.rounding;
1975    else checkInt32(rm, 0, 8);
1976
1977    return finalise(x, dp + x.e + 1, rm);
1978  };
1979
1980
1981  /*
1982   * Return a string representing the value of this Decimal in exponential notation rounded to
1983   * `dp` fixed decimal places using rounding mode `rounding`.
1984   *
1985   * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.
1986   * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
1987   *
1988   */
1989  P.toExponential = function (dp, rm) {
1990    var str,
1991      x = this,
1992      Ctor = x.constructor;
1993
1994    if (dp === void 0) {
1995      str = finiteToString(x, true);
1996    } else {
1997      checkInt32(dp, 0, MAX_DIGITS);
1998
1999      if (rm === void 0) rm = Ctor.rounding;
2000      else checkInt32(rm, 0, 8);
2001
2002      x = finalise(new Ctor(x), dp + 1, rm);
2003      str = finiteToString(x, true, dp + 1);
2004    }
2005
2006    return x.isNeg() && !x.isZero() ? '-' + str : str;
2007  };
2008
2009
2010  /*
2011   * Return a string representing the value of this Decimal in normal (fixed-point) notation to
2012   * `dp` fixed decimal places and rounded using rounding mode `rm` or `rounding` if `rm` is
2013   * omitted.
2014   *
2015   * As with JavaScript numbers, (-0).toFixed(0) is '0', but e.g. (-0.00001).toFixed(0) is '-0'.
2016   *
2017   * [dp] {number} Decimal places. Integer, 0 to MAX_DIGITS inclusive.
2018   * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
2019   *
2020   * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.
2021   * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.
2022   * (-0).toFixed(3) is '0.000'.
2023   * (-0.5).toFixed(0) is '-0'.
2024   *
2025   */
2026  P.toFixed = function (dp, rm) {
2027    var str, y,
2028      x = this,
2029      Ctor = x.constructor;
2030
2031    if (dp === void 0) {
2032      str = finiteToString(x);
2033    } else {
2034      checkInt32(dp, 0, MAX_DIGITS);
2035
2036      if (rm === void 0) rm = Ctor.rounding;
2037      else checkInt32(rm, 0, 8);
2038
2039      y = finalise(new Ctor(x), dp + x.e + 1, rm);
2040      str = finiteToString(y, false, dp + y.e + 1);
2041    }
2042
2043    // To determine whether to add the minus sign look at the value before it was rounded,
2044    // i.e. look at `x` rather than `y`.
2045    return x.isNeg() && !x.isZero() ? '-' + str : str;
2046  };
2047
2048
2049  /*
2050   * Return an array representing the value of this Decimal as a simple fraction with an integer
2051   * numerator and an integer denominator.
2052   *
2053   * The denominator will be a positive non-zero value less than or equal to the specified maximum
2054   * denominator. If a maximum denominator is not specified, the denominator will be the lowest
2055   * value necessary to represent the number exactly.
2056   *
2057   * [maxD] {number|string|Decimal} Maximum denominator. Integer >= 1 and < Infinity.
2058   *
2059   */
2060  P.toFraction = function (maxD) {
2061    var d, d0, d1, d2, e, k, n, n0, n1, pr, q, r,
2062      x = this,
2063      xd = x.d,
2064      Ctor = x.constructor;
2065
2066    if (!xd) return new Ctor(x);
2067
2068    n1 = d0 = new Ctor(1);
2069    d1 = n0 = new Ctor(0);
2070
2071    d = new Ctor(d1);
2072    e = d.e = getPrecision(xd) - x.e - 1;
2073    k = e % LOG_BASE;
2074    d.d[0] = mathpow(10, k < 0 ? LOG_BASE + k : k);
2075
2076    if (maxD == null) {
2077
2078      // d is 10**e, the minimum max-denominator needed.
2079      maxD = e > 0 ? d : n1;
2080    } else {
2081      n = new Ctor(maxD);
2082      if (!n.isInt() || n.lt(n1)) throw Error(invalidArgument + n);
2083      maxD = n.gt(d) ? (e > 0 ? d : n1) : n;
2084    }
2085
2086    external = false;
2087    n = new Ctor(digitsToString(xd));
2088    pr = Ctor.precision;
2089    Ctor.precision = e = xd.length * LOG_BASE * 2;
2090
2091    for (;;)  {
2092      q = divide(n, d, 0, 1, 1);
2093      d2 = d0.plus(q.times(d1));
2094      if (d2.cmp(maxD) == 1) break;
2095      d0 = d1;
2096      d1 = d2;
2097      d2 = n1;
2098      n1 = n0.plus(q.times(d2));
2099      n0 = d2;
2100      d2 = d;
2101      d = n.minus(q.times(d2));
2102      n = d2;
2103    }
2104
2105    d2 = divide(maxD.minus(d0), d1, 0, 1, 1);
2106    n0 = n0.plus(d2.times(n1));
2107    d0 = d0.plus(d2.times(d1));
2108    n0.s = n1.s = x.s;
2109
2110    // Determine which fraction is closer to x, n0/d0 or n1/d1?
2111    r = divide(n1, d1, e, 1).minus(x).abs().cmp(divide(n0, d0, e, 1).minus(x).abs()) < 1
2112        ? [n1, d1] : [n0, d0];
2113
2114    Ctor.precision = pr;
2115    external = true;
2116
2117    return r;
2118  };
2119
2120
2121  /*
2122   * Return a string representing the value of this Decimal in base 16, round to `sd` significant
2123   * digits using rounding mode `rm`.
2124   *
2125   * If the optional `sd` argument is present then return binary exponential notation.
2126   *
2127   * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.
2128   * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
2129   *
2130   */
2131  P.toHexadecimal = P.toHex = function (sd, rm) {
2132    return toStringBinary(this, 16, sd, rm);
2133  };
2134
2135
2136  /*
2137   * Returns a new Decimal whose value is the nearest multiple of `y` in the direction of rounding
2138   * mode `rm`, or `Decimal.rounding` if `rm` is omitted, to the value of this Decimal.
2139   *
2140   * The return value will always have the same sign as this Decimal, unless either this Decimal
2141   * or `y` is NaN, in which case the return value will be also be NaN.
2142   *
2143   * The return value is not affected by the value of `precision`.
2144   *
2145   * y {number|string|Decimal} The magnitude to round to a multiple of.
2146   * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
2147   *
2148   * 'toNearest() rounding mode not an integer: {rm}'
2149   * 'toNearest() rounding mode out of range: {rm}'
2150   *
2151   */
2152  P.toNearest = function (y, rm) {
2153    var x = this,
2154      Ctor = x.constructor;
2155
2156    x = new Ctor(x);
2157
2158    if (y == null) {
2159
2160      // If x is not finite, return x.
2161      if (!x.d) return x;
2162
2163      y = new Ctor(1);
2164      rm = Ctor.rounding;
2165    } else {
2166      y = new Ctor(y);
2167      if (rm === void 0) {
2168        rm = Ctor.rounding;
2169      } else {
2170        checkInt32(rm, 0, 8);
2171      }
2172
2173      // If x is not finite, return x if y is not NaN, else NaN.
2174      if (!x.d) return y.s ? x : y;
2175
2176      // If y is not finite, return Infinity with the sign of x if y is Infinity, else NaN.
2177      if (!y.d) {
2178        if (y.s) y.s = x.s;
2179        return y;
2180      }
2181    }
2182
2183    // If y is not zero, calculate the nearest multiple of y to x.
2184    if (y.d[0]) {
2185      external = false;
2186      x = divide(x, y, 0, rm, 1).times(y);
2187      external = true;
2188      finalise(x);
2189
2190    // If y is zero, return zero with the sign of x.
2191    } else {
2192      y.s = x.s;
2193      x = y;
2194    }
2195
2196    return x;
2197  };
2198
2199
2200  /*
2201   * Return the value of this Decimal converted to a number primitive.
2202   * Zero keeps its sign.
2203   *
2204   */
2205  P.toNumber = function () {
2206    return +this;
2207  };
2208
2209
2210  /*
2211   * Return a string representing the value of this Decimal in base 8, round to `sd` significant
2212   * digits using rounding mode `rm`.
2213   *
2214   * If the optional `sd` argument is present then return binary exponential notation.
2215   *
2216   * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.
2217   * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
2218   *
2219   */
2220  P.toOctal = function (sd, rm) {
2221    return toStringBinary(this, 8, sd, rm);
2222  };
2223
2224
2225  /*
2226   * Return a new Decimal whose value is the value of this Decimal raised to the power `y`, rounded
2227   * to `precision` significant digits using rounding mode `rounding`.
2228   *
2229   * ECMAScript compliant.
2230   *
2231   *   pow(x, NaN)                           = NaN
2232   *   pow(x, ±0)                            = 1
2233
2234   *   pow(NaN, non-zero)                    = NaN
2235   *   pow(abs(x) > 1, +Infinity)            = +Infinity
2236   *   pow(abs(x) > 1, -Infinity)            = +0
2237   *   pow(abs(x) == 1, ±Infinity)           = NaN
2238   *   pow(abs(x) < 1, +Infinity)            = +0
2239   *   pow(abs(x) < 1, -Infinity)            = +Infinity
2240   *   pow(+Infinity, y > 0)                 = +Infinity
2241   *   pow(+Infinity, y < 0)                 = +0
2242   *   pow(-Infinity, odd integer > 0)       = -Infinity
2243   *   pow(-Infinity, even integer > 0)      = +Infinity
2244   *   pow(-Infinity, odd integer < 0)       = -0
2245   *   pow(-Infinity, even integer < 0)      = +0
2246   *   pow(+0, y > 0)                        = +0
2247   *   pow(+0, y < 0)                        = +Infinity
2248   *   pow(-0, odd integer > 0)              = -0
2249   *   pow(-0, even integer > 0)             = +0
2250   *   pow(-0, odd integer < 0)              = -Infinity
2251   *   pow(-0, even integer < 0)             = +Infinity
2252   *   pow(finite x < 0, finite non-integer) = NaN
2253   *
2254   * For non-integer or very large exponents pow(x, y) is calculated using
2255   *
2256   *   x^y = exp(y*ln(x))
2257   *
2258   * Assuming the first 15 rounding digits are each equally likely to be any digit 0-9, the
2259   * probability of an incorrectly rounded result
2260   * P([49]9{14} | [50]0{14}) = 2 * 0.2 * 10^-14 = 4e-15 = 1/2.5e+14
2261   * i.e. 1 in 250,000,000,000,000
2262   *
2263   * If a result is incorrectly rounded the maximum error will be 1 ulp (unit in last place).
2264   *
2265   * y {number|string|Decimal} The power to which to raise this Decimal.
2266   *
2267   */
2268  P.toPower = P.pow = function (y) {
2269    var e, k, pr, r, rm, s,
2270      x = this,
2271      Ctor = x.constructor,
2272      yn = +(y = new Ctor(y));
2273
2274    // Either ±Infinity, NaN or ±0?
2275    if (!x.d || !y.d || !x.d[0] || !y.d[0]) return new Ctor(mathpow(+x, yn));
2276
2277    x = new Ctor(x);
2278
2279    if (x.eq(1)) return x;
2280
2281    pr = Ctor.precision;
2282    rm = Ctor.rounding;
2283
2284    if (y.eq(1)) return finalise(x, pr, rm);
2285
2286    // y exponent
2287    e = mathfloor(y.e / LOG_BASE);
2288
2289    // If y is a small integer use the 'exponentiation by squaring' algorithm.
2290    if (e >= y.d.length - 1 && (k = yn < 0 ? -yn : yn) <= MAX_SAFE_INTEGER) {
2291      r = intPow(Ctor, x, k, pr);
2292      return y.s < 0 ? new Ctor(1).div(r) : finalise(r, pr, rm);
2293    }
2294
2295    s = x.s;
2296
2297    // if x is negative
2298    if (s < 0) {
2299
2300      // if y is not an integer
2301      if (e < y.d.length - 1) return new Ctor(NaN);
2302
2303      // Result is positive if x is negative and the last digit of integer y is even.
2304      if ((y.d[e] & 1) == 0) s = 1;
2305
2306      // if x.eq(-1)
2307      if (x.e == 0 && x.d[0] == 1 && x.d.length == 1) {
2308        x.s = s;
2309        return x;
2310      }
2311    }
2312
2313    // Estimate result exponent.
2314    // x^y = 10^e,  where e = y * log10(x)
2315    // log10(x) = log10(x_significand) + x_exponent
2316    // log10(x_significand) = ln(x_significand) / ln(10)
2317    k = mathpow(+x, yn);
2318    e = k == 0 || !isFinite(k)
2319      ? mathfloor(yn * (Math.log('0.' + digitsToString(x.d)) / Math.LN10 + x.e + 1))
2320      : new Ctor(k + '').e;
2321
2322    // Exponent estimate may be incorrect e.g. x: 0.999999999999999999, y: 2.29, e: 0, r.e: -1.
2323
2324    // Overflow/underflow?
2325    if (e > Ctor.maxE + 1 || e < Ctor.minE - 1) return new Ctor(e > 0 ? s / 0 : 0);
2326
2327    external = false;
2328    Ctor.rounding = x.s = 1;
2329
2330    // Estimate the extra guard digits needed to ensure five correct rounding digits from
2331    // naturalLogarithm(x). Example of failure without these extra digits (precision: 10):
2332    // new Decimal(2.32456).pow('2087987436534566.46411')
2333    // should be 1.162377823e+764914905173815, but is 1.162355823e+764914905173815
2334    k = Math.min(12, (e + '').length);
2335
2336    // r = x^y = exp(y*ln(x))
2337    r = naturalExponential(y.times(naturalLogarithm(x, pr + k)), pr);
2338
2339    // r may be Infinity, e.g. (0.9999999999999999).pow(-1e+40)
2340    if (r.d) {
2341
2342      // Truncate to the required precision plus five rounding digits.
2343      r = finalise(r, pr + 5, 1);
2344
2345      // If the rounding digits are [49]9999 or [50]0000 increase the precision by 10 and recalculate
2346      // the result.
2347      if (checkRoundingDigits(r.d, pr, rm)) {
2348        e = pr + 10;
2349
2350        // Truncate to the increased precision plus five rounding digits.
2351        r = finalise(naturalExponential(y.times(naturalLogarithm(x, e + k)), e), e + 5, 1);
2352
2353        // Check for 14 nines from the 2nd rounding digit (the first rounding digit may be 4 or 9).
2354        if (+digitsToString(r.d).slice(pr + 1, pr + 15) + 1 == 1e14) {
2355          r = finalise(r, pr + 1, 0);
2356        }
2357      }
2358    }
2359
2360    r.s = s;
2361    external = true;
2362    Ctor.rounding = rm;
2363
2364    return finalise(r, pr, rm);
2365  };
2366
2367
2368  /*
2369   * Return a string representing the value of this Decimal rounded to `sd` significant digits
2370   * using rounding mode `rounding`.
2371   *
2372   * Return exponential notation if `sd` is less than the number of digits necessary to represent
2373   * the integer part of the value in normal notation.
2374   *
2375   * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.
2376   * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
2377   *
2378   */
2379  P.toPrecision = function (sd, rm) {
2380    var str,
2381      x = this,
2382      Ctor = x.constructor;
2383
2384    if (sd === void 0) {
2385      str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);
2386    } else {
2387      checkInt32(sd, 1, MAX_DIGITS);
2388
2389      if (rm === void 0) rm = Ctor.rounding;
2390      else checkInt32(rm, 0, 8);
2391
2392      x = finalise(new Ctor(x), sd, rm);
2393      str = finiteToString(x, sd <= x.e || x.e <= Ctor.toExpNeg, sd);
2394    }
2395
2396    return x.isNeg() && !x.isZero() ? '-' + str : str;
2397  };
2398
2399
2400  /*
2401   * Return a new Decimal whose value is the value of this Decimal rounded to a maximum of `sd`
2402   * significant digits using rounding mode `rm`, or to `precision` and `rounding` respectively if
2403   * omitted.
2404   *
2405   * [sd] {number} Significant digits. Integer, 1 to MAX_DIGITS inclusive.
2406   * [rm] {number} Rounding mode. Integer, 0 to 8 inclusive.
2407   *
2408   * 'toSD() digits out of range: {sd}'
2409   * 'toSD() digits not an integer: {sd}'
2410   * 'toSD() rounding mode not an integer: {rm}'
2411   * 'toSD() rounding mode out of range: {rm}'
2412   *
2413   */
2414  P.toSignificantDigits = P.toSD = function (sd, rm) {
2415    var x = this,
2416      Ctor = x.constructor;
2417
2418    if (sd === void 0) {
2419      sd = Ctor.precision;
2420      rm = Ctor.rounding;
2421    } else {
2422      checkInt32(sd, 1, MAX_DIGITS);
2423
2424      if (rm === void 0) rm = Ctor.rounding;
2425      else checkInt32(rm, 0, 8);
2426    }
2427
2428    return finalise(new Ctor(x), sd, rm);
2429  };
2430
2431
2432  /*
2433   * Return a string representing the value of this Decimal.
2434   *
2435   * Return exponential notation if this Decimal has a positive exponent equal to or greater than
2436   * `toExpPos`, or a negative exponent equal to or less than `toExpNeg`.
2437   *
2438   */
2439  P.toString = function () {
2440    var x = this,
2441      Ctor = x.constructor,
2442      str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);
2443
2444    return x.isNeg() && !x.isZero() ? '-' + str : str;
2445  };
2446
2447
2448  /*
2449   * Return a new Decimal whose value is the value of this Decimal truncated to a whole number.
2450   *
2451   */
2452  P.truncated = P.trunc = function () {
2453    return finalise(new this.constructor(this), this.e + 1, 1);
2454  };
2455
2456
2457  /*
2458   * Return a string representing the value of this Decimal.
2459   * Unlike `toString`, negative zero will include the minus sign.
2460   *
2461   */
2462  P.valueOf = P.toJSON = function () {
2463    var x = this,
2464      Ctor = x.constructor,
2465      str = finiteToString(x, x.e <= Ctor.toExpNeg || x.e >= Ctor.toExpPos);
2466
2467    return x.isNeg() ? '-' + str : str;
2468  };
2469
2470
2471  // Helper functions for Decimal.prototype (P) and/or Decimal methods, and their callers.
2472
2473
2474  /*
2475   *  digitsToString           P.cubeRoot, P.logarithm, P.squareRoot, P.toFraction, P.toPower,
2476   *                           finiteToString, naturalExponential, naturalLogarithm
2477   *  checkInt32               P.toDecimalPlaces, P.toExponential, P.toFixed, P.toNearest,
2478   *                           P.toPrecision, P.toSignificantDigits, toStringBinary, random
2479   *  checkRoundingDigits      P.logarithm, P.toPower, naturalExponential, naturalLogarithm
2480   *  convertBase              toStringBinary, parseOther
2481   *  cos                      P.cos
2482   *  divide                   P.atanh, P.cubeRoot, P.dividedBy, P.dividedToIntegerBy,
2483   *                           P.logarithm, P.modulo, P.squareRoot, P.tan, P.tanh, P.toFraction,
2484   *                           P.toNearest, toStringBinary, naturalExponential, naturalLogarithm,
2485   *                           taylorSeries, atan2, parseOther
2486   *  finalise                 P.absoluteValue, P.atan, P.atanh, P.ceil, P.cos, P.cosh,
2487   *                           P.cubeRoot, P.dividedToIntegerBy, P.floor, P.logarithm, P.minus,
2488   *                           P.modulo, P.negated, P.plus, P.round, P.sin, P.sinh, P.squareRoot,
2489   *                           P.tan, P.times, P.toDecimalPlaces, P.toExponential, P.toFixed,
2490   *                           P.toNearest, P.toPower, P.toPrecision, P.toSignificantDigits,
2491   *                           P.truncated, divide, getLn10, getPi, naturalExponential,
2492   *                           naturalLogarithm, ceil, floor, round, trunc
2493   *  finiteToString           P.toExponential, P.toFixed, P.toPrecision, P.toString, P.valueOf,
2494   *                           toStringBinary
vendor: 17,162 bytes, lines 2495-3106
2495   *  getBase10Exponent        P.minus, P.plus, P.times, parseOther
2496   *  getLn10                  P.logarithm, naturalLogarithm
2497   *  getPi                    P.acos, P.asin, P.atan, toLessThanHalfPi, atan2
2498   *  getPrecision             P.precision, P.toFraction
2499   *  getZeroString            digitsToString, finiteToString
2500   *  intPow                   P.toPower, parseOther
2501   *  isOdd                    toLessThanHalfPi
2502   *  maxOrMin                 max, min
2503   *  naturalExponential       P.naturalExponential, P.toPower
2504   *  naturalLogarithm         P.acosh, P.asinh, P.atanh, P.logarithm, P.naturalLogarithm,
2505   *                           P.toPower, naturalExponential
2506   *  nonFiniteToString        finiteToString, toStringBinary
2507   *  parseDecimal             Decimal
2508   *  parseOther               Decimal
2509   *  sin                      P.sin
2510   *  taylorSeries             P.cosh, P.sinh, cos, sin
2511   *  toLessThanHalfPi         P.cos, P.sin
2512   *  toStringBinary           P.toBinary, P.toHexadecimal, P.toOctal
2513   *  truncate                 intPow
2514   *
2515   *  Throws:                  P.logarithm, P.precision, P.toFraction, checkInt32, getLn10, getPi,
2516   *                           naturalLogarithm, config, parseOther, random, Decimal
2517   */
2518
2519
2520  function digitsToString(d) {
2521    var i, k, ws,
2522      indexOfLastWord = d.length - 1,
2523      str = '',
2524      w = d[0];
2525
2526    if (indexOfLastWord > 0) {
2527      str += w;
2528      for (i = 1; i < indexOfLastWord; i++) {
2529        ws = d[i] + '';
2530        k = LOG_BASE - ws.length;
2531        if (k) str += getZeroString(k);
2532        str += ws;
2533      }
2534
2535      w = d[i];
2536      ws = w + '';
2537      k = LOG_BASE - ws.length;
2538      if (k) str += getZeroString(k);
2539    } else if (w === 0) {
2540      return '0';
2541    }
2542
2543    // Remove trailing zeros of last w.
2544    for (; w % 10 === 0;) w /= 10;
2545
2546    return str + w;
2547  }
2548
2549
2550  function checkInt32(i, min, max) {
2551    if (i !== ~~i || i < min || i > max) {
2552      throw Error(invalidArgument + i);
2553    }
2554  }
2555
2556
2557  /*
2558   * Check 5 rounding digits if `repeating` is null, 4 otherwise.
2559   * `repeating == null` if caller is `log` or `pow`,
2560   * `repeating != null` if caller is `naturalLogarithm` or `naturalExponential`.
2561   */
2562  function checkRoundingDigits(d, i, rm, repeating) {
2563    var di, k, r, rd;
2564
2565    // Get the length of the first word of the array d.
2566    for (k = d[0]; k >= 10; k /= 10) --i;
2567
2568    // Is the rounding digit in the first word of d?
2569    if (--i < 0) {
2570      i += LOG_BASE;
2571      di = 0;
2572    } else {
2573      di = Math.ceil((i + 1) / LOG_BASE);
2574      i %= LOG_BASE;
2575    }
2576
2577    // i is the index (0 - 6) of the rounding digit.
2578    // E.g. if within the word 3487563 the first rounding digit is 5,
2579    // then i = 4, k = 1000, rd = 3487563 % 1000 = 563
2580    k = mathpow(10, LOG_BASE - i);
2581    rd = d[di] % k | 0;
2582
2583    if (repeating == null) {
2584      if (i < 3) {
2585        if (i == 0) rd = rd / 100 | 0;
2586        else if (i == 1) rd = rd / 10 | 0;
2587        r = rm < 4 && rd == 99999 || rm > 3 && rd == 49999 || rd == 50000 || rd == 0;
2588      } else {
2589        r = (rm < 4 && rd + 1 == k || rm > 3 && rd + 1 == k / 2) &&
2590          (d[di + 1] / k / 100 | 0) == mathpow(10, i - 2) - 1 ||
2591            (rd == k / 2 || rd == 0) && (d[di + 1] / k / 100 | 0) == 0;
2592      }
2593    } else {
2594      if (i < 4) {
2595        if (i == 0) rd = rd / 1000 | 0;
2596        else if (i == 1) rd = rd / 100 | 0;
2597        else if (i == 2) rd = rd / 10 | 0;
2598        r = (repeating || rm < 4) && rd == 9999 || !repeating && rm > 3 && rd == 4999;
2599      } else {
2600        r = ((repeating || rm < 4) && rd + 1 == k ||
2601        (!repeating && rm > 3) && rd + 1 == k / 2) &&
2602          (d[di + 1] / k / 1000 | 0) == mathpow(10, i - 3) - 1;
2603      }
2604    }
2605
2606    return r;
2607  }
2608
2609
2610  // Convert string of `baseIn` to an array of numbers of `baseOut`.
2611  // Eg. convertBase('255', 10, 16) returns [15, 15].
2612  // Eg. convertBase('ff', 16, 10) returns [2, 5, 5].
2613  function convertBase(str, baseIn, baseOut) {
2614    var j,
2615      arr = [0],
2616      arrL,
2617      i = 0,
2618      strL = str.length;
2619
2620    for (; i < strL;) {
2621      for (arrL = arr.length; arrL--;) arr[arrL] *= baseIn;
2622      arr[0] += NUMERALS.indexOf(str.charAt(i++));
2623      for (j = 0; j < arr.length; j++) {
2624        if (arr[j] > baseOut - 1) {
2625          if (arr[j + 1] === void 0) arr[j + 1] = 0;
2626          arr[j + 1] += arr[j] / baseOut | 0;
2627          arr[j] %= baseOut;
2628        }
2629      }
2630    }
2631
2632    return arr.reverse();
2633  }
2634
2635
2636  /*
2637   * cos(x) = 1 - x^2/2! + x^4/4! - ...
2638   * |x| < pi/2
2639   *
2640   */
2641  function cosine(Ctor, x) {
2642    var k, len, y;
2643
2644    if (x.isZero()) return x;
2645
2646    // Argument reduction: cos(4x) = 8*(cos^4(x) - cos^2(x)) + 1
2647    // i.e. cos(x) = 8*(cos^4(x/4) - cos^2(x/4)) + 1
2648
2649    // Estimate the optimum number of times to use the argument reduction.
2650    len = x.d.length;
2651    if (len < 32) {
2652      k = Math.ceil(len / 3);
2653      y = (1 / tinyPow(4, k)).toString();
2654    } else {
2655      k = 16;
2656      y = '2.3283064365386962890625e-10';
2657    }
2658
2659    Ctor.precision += k;
2660
2661    x = taylorSeries(Ctor, 1, x.times(y), new Ctor(1));
2662
2663    // Reverse argument reduction
2664    for (var i = k; i--;) {
2665      var cos2x = x.times(x);
2666      x = cos2x.times(cos2x).minus(cos2x).times(8).plus(1);
2667    }
2668
2669    Ctor.precision -= k;
2670
2671    return x;
2672  }
2673
2674
2675  /*
2676   * Perform division in the specified base.
2677   */
2678  var divide = (function () {
2679
2680    // Assumes non-zero x and k, and hence non-zero result.
2681    function multiplyInteger(x, k, base) {
2682      var temp,
2683        carry = 0,
2684        i = x.length;
2685
2686      for (x = x.slice(); i--;) {
2687        temp = x[i] * k + carry;
2688        x[i] = temp % base | 0;
2689        carry = temp / base | 0;
2690      }
2691
2692      if (carry) x.unshift(carry);
2693
2694      return x;
2695    }
2696
2697    function compare(a, b, aL, bL) {
2698      var i, r;
2699
2700      if (aL != bL) {
2701        r = aL > bL ? 1 : -1;
2702      } else {
2703        for (i = r = 0; i < aL; i++) {
2704          if (a[i] != b[i]) {
2705            r = a[i] > b[i] ? 1 : -1;
2706            break;
2707          }
2708        }
2709      }
2710
2711      return r;
2712    }
2713
2714    function subtract(a, b, aL, base) {
2715      var i = 0;
2716
2717      // Subtract b from a.
2718      for (; aL--;) {
2719        a[aL] -= i;
2720        i = a[aL] < b[aL] ? 1 : 0;
2721        a[aL] = i * base + a[aL] - b[aL];
2722      }
2723
2724      // Remove leading zeros.
2725      for (; !a[0] && a.length > 1;) a.shift();
2726    }
2727
2728    return function (x, y, pr, rm, dp, base) {
2729      var cmp, e, i, k, logBase, more, prod, prodL, q, qd, rem, remL, rem0, sd, t, xi, xL, yd0,
2730        yL, yz,
2731        Ctor = x.constructor,
2732        sign = x.s == y.s ? 1 : -1,
2733        xd = x.d,
2734        yd = y.d;
2735
2736      // Either NaN, Infinity or 0?
2737      if (!xd || !xd[0] || !yd || !yd[0]) {
2738
2739        return new Ctor(// Return NaN if either NaN, or both Infinity or 0.
2740          !x.s || !y.s || (xd ? yd && xd[0] == yd[0] : !yd) ? NaN :
2741
2742          // Return ±0 if x is 0 or y is ±Infinity, or return ±Infinity as y is 0.
2743          xd && xd[0] == 0 || !yd ? sign * 0 : sign / 0);
2744      }
2745
2746      if (base) {
2747        logBase = 1;
2748        e = x.e - y.e;
2749      } else {
2750        base = BASE;
2751        logBase = LOG_BASE;
2752        e = mathfloor(x.e / logBase) - mathfloor(y.e / logBase);
2753      }
2754
2755      yL = yd.length;
2756      xL = xd.length;
2757      q = new Ctor(sign);
2758      qd = q.d = [];
2759
2760      // Result exponent may be one less than e.
2761      // The digit array of a Decimal from toStringBinary may have trailing zeros.
2762      for (i = 0; yd[i] == (xd[i] || 0); i++);
2763
2764      if (yd[i] > (xd[i] || 0)) e--;
2765
2766      if (pr == null) {
2767        sd = pr = Ctor.precision;
2768        rm = Ctor.rounding;
2769      } else if (dp) {
2770        sd = pr + (x.e - y.e) + 1;
2771      } else {
2772        sd = pr;
2773      }
2774
2775      if (sd < 0) {
2776        qd.push(1);
2777        more = true;
2778      } else {
2779
2780        // Convert precision in number of base 10 digits to base 1e7 digits.
2781        sd = sd / logBase + 2 | 0;
2782        i = 0;
2783
2784        // divisor < 1e7
2785        if (yL == 1) {
2786          k = 0;
2787          yd = yd[0];
2788          sd++;
2789
2790          // k is the carry.
2791          for (; (i < xL || k) && sd--; i++) {
2792            t = k * base + (xd[i] || 0);
2793            qd[i] = t / yd | 0;
2794            k = t % yd | 0;
2795          }
2796
2797          more = k || i < xL;
2798
2799        // divisor >= 1e7
2800        } else {
2801
2802          // Normalise xd and yd so highest order digit of yd is >= base/2
2803          k = base / (yd[0] + 1) | 0;
2804
2805          if (k > 1) {
2806            yd = multiplyInteger(yd, k, base);
2807            xd = multiplyInteger(xd, k, base);
2808            yL = yd.length;
2809            xL = xd.length;
2810          }
2811
2812          xi = yL;
2813          rem = xd.slice(0, yL);
2814          remL = rem.length;
2815
2816          // Add zeros to make remainder as long as divisor.
2817          for (; remL < yL;) rem[remL++] = 0;
2818
2819          yz = yd.slice();
2820          yz.unshift(0);
2821          yd0 = yd[0];
2822
2823          if (yd[1] >= base / 2) ++yd0;
2824
2825          do {
2826            k = 0;
2827
2828            // Compare divisor and remainder.
2829            cmp = compare(yd, rem, yL, remL);
2830
2831            // If divisor < remainder.
2832            if (cmp < 0) {
2833
2834              // Calculate trial digit, k.
2835              rem0 = rem[0];
2836              if (yL != remL) rem0 = rem0 * base + (rem[1] || 0);
2837
2838              // k will be how many times the divisor goes into the current remainder.
2839              k = rem0 / yd0 | 0;
2840
2841              //  Algorithm:
2842              //  1. product = divisor * trial digit (k)
2843              //  2. if product > remainder: product -= divisor, k--
2844              //  3. remainder -= product
2845              //  4. if product was < remainder at 2:
2846              //    5. compare new remainder and divisor
2847              //    6. If remainder > divisor: remainder -= divisor, k++
2848
2849              if (k > 1) {
2850                if (k >= base) k = base - 1;
2851
2852                // product = divisor * trial digit.
2853                prod = multiplyInteger(yd, k, base);
2854                prodL = prod.length;
2855                remL = rem.length;
2856
2857                // Compare product and remainder.
2858                cmp = compare(prod, rem, prodL, remL);
2859
2860                // product > remainder.
2861                if (cmp == 1) {
2862                  k--;
2863
2864                  // Subtract divisor from product.
2865                  subtract(prod, yL < prodL ? yz : yd, prodL, base);
2866                }
2867              } else {
2868
2869                // cmp is -1.
2870                // If k is 0, there is no need to compare yd and rem again below, so change cmp to 1
2871                // to avoid it. If k is 1 there is a need to compare yd and rem again below.
2872                if (k == 0) cmp = k = 1;
2873                prod = yd.slice();
2874              }
2875
2876              prodL = prod.length;
2877              if (prodL < remL) prod.unshift(0);
2878
2879              // Subtract product from remainder.
2880              subtract(rem, prod, remL, base);
2881
2882              // If product was < previous remainder.
2883              if (cmp == -1) {
2884                remL = rem.length;
2885
2886                // Compare divisor and new remainder.
2887                cmp = compare(yd, rem, yL, remL);
2888
2889                // If divisor < new remainder, subtract divisor from remainder.
2890                if (cmp < 1) {
2891                  k++;
2892
2893                  // Subtract divisor from remainder.
2894                  subtract(rem, yL < remL ? yz : yd, remL, base);
2895                }
2896              }
2897
2898              remL = rem.length;
2899            } else if (cmp === 0) {
2900              k++;
2901              rem = [0];
2902            }    // if cmp === 1, k will be 0
2903
2904            // Add the next digit, k, to the result array.
2905            qd[i++] = k;
2906
2907            // Update the remainder.
2908            if (cmp && rem[0]) {
2909              rem[remL++] = xd[xi] || 0;
2910            } else {
2911              rem = [xd[xi]];
2912              remL = 1;
2913            }
2914
2915          } while ((xi++ < xL || rem[0] !== void 0) && sd--);
2916
2917          more = rem[0] !== void 0;
2918        }
2919
2920        // Leading zero?
2921        if (!qd[0]) qd.shift();
2922      }
2923
2924      // logBase is 1 when divide is being used for base conversion.
2925      if (logBase == 1) {
2926        q.e = e;
2927        inexact = more;
2928      } else {
2929
2930        // To calculate q.e, first get the number of digits of qd[0].
2931        for (i = 1, k = qd[0]; k >= 10; k /= 10) i++;
2932        q.e = i + e * logBase - 1;
2933
2934        finalise(q, dp ? pr + q.e + 1 : pr, rm, more);
2935      }
2936
2937      return q;
2938    };
2939  })();
2940
2941
2942  /*
2943   * Round `x` to `sd` significant digits using rounding mode `rm`.
2944   * Check for over/under-flow.
2945   */
2946   function finalise(x, sd, rm, isTruncated) {
2947    var digits, i, j, k, rd, roundUp, w, xd, xdi,
2948      Ctor = x.constructor;
2949
2950    // Don't round if sd is null or undefined.
2951    out: if (sd != null) {
2952      xd = x.d;
2953
2954      // Infinity/NaN.
2955      if (!xd) return x;
2956
2957      // rd: the rounding digit, i.e. the digit after the digit that may be rounded up.
2958      // w: the word of xd containing rd, a base 1e7 number.
2959      // xdi: the index of w within xd.
2960      // digits: the number of digits of w.
2961      // i: what would be the index of rd within w if all the numbers were 7 digits long (i.e. if
2962      // they had leading zeros)
2963      // j: if > 0, the actual index of rd within w (if < 0, rd is a leading zero).
2964
2965      // Get the length of the first word of the digits array xd.
2966      for (digits = 1, k = xd[0]; k >= 10; k /= 10) digits++;
2967      i = sd - digits;
2968
2969      // Is the rounding digit in the first word of xd?
2970      if (i < 0) {
2971        i += LOG_BASE;
2972        j = sd;
2973        w = xd[xdi = 0];
2974
2975        // Get the rounding digit at index j of w.
2976        rd = w / mathpow(10, digits - j - 1) % 10 | 0;
2977      } else {
2978        xdi = Math.ceil((i + 1) / LOG_BASE);
2979        k = xd.length;
2980        if (xdi >= k) {
2981          if (isTruncated) {
2982
2983            // Needed by `naturalExponential`, `naturalLogarithm` and `squareRoot`.
2984            for (; k++ <= xdi;) xd.push(0);
2985            w = rd = 0;
2986            digits = 1;
2987            i %= LOG_BASE;
2988            j = i - LOG_BASE + 1;
2989          } else {
2990            break out;
2991          }
2992        } else {
2993          w = k = xd[xdi];
2994
2995          // Get the number of digits of w.
2996          for (digits = 1; k >= 10; k /= 10) digits++;
2997
2998          // Get the index of rd within w.
2999          i %= LOG_BASE;
3000
3001          // Get the index of rd within w, adjusted for leading zeros.
3002          // The number of leading zeros of w is given by LOG_BASE - digits.
3003          j = i - LOG_BASE + digits;
3004
3005          // Get the rounding digit at index j of w.
3006          rd = j < 0 ? 0 : w / mathpow(10, digits - j - 1) % 10 | 0;
3007        }
3008      }
3009
3010      // Are there any non-zero digits after the rounding digit?
3011      isTruncated = isTruncated || sd < 0 ||
3012        xd[xdi + 1] !== void 0 || (j < 0 ? w : w % mathpow(10, digits - j - 1));
3013
3014      // The expression `w % mathpow(10, digits - j - 1)` returns all the digits of w to the right
3015      // of the digit at (left-to-right) index j, e.g. if w is 908714 and j is 2, the expression
3016      // will give 714.
3017
3018      roundUp = rm < 4
3019        ? (rd || isTruncated) && (rm == 0 || rm == (x.s < 0 ? 3 : 2))
3020        : rd > 5 || rd == 5 && (rm == 4 || isTruncated || rm == 6 &&
3021
3022          // Check whether the digit to the left of the rounding digit is odd.
3023          ((i > 0 ? j > 0 ? w / mathpow(10, digits - j) : 0 : xd[xdi - 1]) % 10) & 1 ||
3024            rm == (x.s < 0 ? 8 : 7));
3025
3026      if (sd < 1 || !xd[0]) {
3027        xd.length = 0;
3028        if (roundUp) {
3029
3030          // Convert sd to decimal places.
3031          sd -= x.e + 1;
3032
3033          // 1, 0.1, 0.01, 0.001, 0.0001 etc.
3034          xd[0] = mathpow(10, (LOG_BASE - sd % LOG_BASE) % LOG_BASE);
3035          x.e = -sd || 0;
3036        } else {
3037
3038          // Zero.
3039          xd[0] = x.e = 0;
3040        }
3041
3042        return x;
3043      }
3044
3045      // Remove excess digits.
3046      if (i == 0) {
3047        xd.length = xdi;
3048        k = 1;
3049        xdi--;
3050      } else {
3051        xd.length = xdi + 1;
3052        k = mathpow(10, LOG_BASE - i);
3053
3054        // E.g. 56700 becomes 56000 if 7 is the rounding digit.
3055        // j > 0 means i > number of leading zeros of w.
3056        xd[xdi] = j > 0 ? (w / mathpow(10, digits - j) % mathpow(10, j) | 0) * k : 0;
3057      }
3058
3059      if (roundUp) {
3060        for (;;) {
3061
3062          // Is the digit to be rounded up in the first word of xd?
3063          if (xdi == 0) {
3064
3065            // i will be the length of xd[0] before k is added.
3066            for (i = 1, j = xd[0]; j >= 10; j /= 10) i++;
3067            j = xd[0] += k;
3068            for (k = 1; j >= 10; j /= 10) k++;
3069
3070            // if i != k the length has increased.
3071            if (i != k) {
3072              x.e++;
3073              if (xd[0] == BASE) xd[0] = 1;
3074            }
3075
3076            break;
3077          } else {
3078            xd[xdi] += k;
3079            if (xd[xdi] != BASE) break;
3080            xd[xdi--] = 0;
3081            k = 1;
3082          }
3083        }
3084      }
3085
3086      // Remove trailing zeros.
3087      for (i = xd.length; xd[--i] === 0;) xd.pop();
3088    }
3089
3090    if (external) {
3091
3092      // Overflow?
3093      if (x.e > Ctor.maxE) {
3094
3095        // Infinity.
3096        x.d = null;
3097        x.e = NaN;
3098
3099      // Underflow?
3100      } else if (x.e < Ctor.minE) {
3101
3102        // Zero.
3103        x.e = 0;
3104        x.d = [0];
3105        // Ctor.underflow = true;
3106      } // else Ctor.underflow = false;
vendor: 4,339 bytes, lines 3107-3288
3107    }
3108
3109    return x;
3110  }
3111
3112
3113  function finiteToString(x, isExp, sd) {
3114    if (!x.isFinite()) return nonFiniteToString(x);
3115    var k,
3116      e = x.e,
3117      str = digitsToString(x.d),
3118      len = str.length;
3119
3120    if (isExp) {
3121      if (sd && (k = sd - len) > 0) {
3122        str = str.charAt(0) + '.' + str.slice(1) + getZeroString(k);
3123      } else if (len > 1) {
3124        str = str.charAt(0) + '.' + str.slice(1);
3125      }
3126
3127      str = str + (x.e < 0 ? 'e' : 'e+') + x.e;
3128    } else if (e < 0) {
3129      str = '0.' + getZeroString(-e - 1) + str;
3130      if (sd && (k = sd - len) > 0) str += getZeroString(k);
3131    } else if (e >= len) {
3132      str += getZeroString(e + 1 - len);
3133      if (sd && (k = sd - e - 1) > 0) str = str + '.' + getZeroString(k);
3134    } else {
3135      if ((k = e + 1) < len) str = str.slice(0, k) + '.' + str.slice(k);
3136      if (sd && (k = sd - len) > 0) {
3137        if (e + 1 === len) str += '.';
3138        str += getZeroString(k);
3139      }
3140    }
3141
3142    return str;
3143  }
3144
3145
3146  // Calculate the base 10 exponent from the base 1e7 exponent.
3147  function getBase10Exponent(digits, e) {
3148    var w = digits[0];
3149
3150    // Add the number of digits of the first word of the digits array.
3151    for ( e *= LOG_BASE; w >= 10; w /= 10) e++;
3152    return e;
3153  }
3154
3155
3156  function getLn10(Ctor, sd, pr) {
3157    if (sd > LN10_PRECISION) {
3158
3159      // Reset global state in case the exception is caught.
3160      external = true;
3161      if (pr) Ctor.precision = pr;
3162      throw Error(precisionLimitExceeded);
3163    }
3164    return finalise(new Ctor(LN10), sd, 1, true);
3165  }
3166
3167
3168  function getPi(Ctor, sd, rm) {
3169    if (sd > PI_PRECISION) throw Error(precisionLimitExceeded);
3170    return finalise(new Ctor(PI), sd, rm, true);
3171  }
3172
3173
3174  function getPrecision(digits) {
3175    var w = digits.length - 1,
3176      len = w * LOG_BASE + 1;
3177
3178    w = digits[w];
3179
3180    // If non-zero...
3181    if (w) {
3182
3183      // Subtract the number of trailing zeros of the last word.
3184      for (; w % 10 == 0; w /= 10) len--;
3185
3186      // Add the number of digits of the first word.
3187      for (w = digits[0]; w >= 10; w /= 10) len++;
3188    }
3189
3190    return len;
3191  }
3192
3193
3194  function getZeroString(k) {
3195    var zs = '';
3196    for (; k--;) zs += '0';
3197    return zs;
3198  }
3199
3200
3201  /*
3202   * Return a new Decimal whose value is the value of Decimal `x` to the power `n`, where `n` is an
3203   * integer of type number.
3204   *
3205   * Implements 'exponentiation by squaring'. Called by `pow` and `parseOther`.
3206   *
3207   */
3208  function intPow(Ctor, x, n, pr) {
3209    var isTruncated,
3210      r = new Ctor(1),
3211
3212      // Max n of 9007199254740991 takes 53 loop iterations.
3213      // Maximum digits array length; leaves [28, 34] guard digits.
3214      k = Math.ceil(pr / LOG_BASE + 4);
3215
3216    external = false;
3217
3218    for (;;) {
3219      if (n % 2) {
3220        r = r.times(x);
3221        if (truncate(r.d, k)) isTruncated = true;
3222      }
3223
3224      n = mathfloor(n / 2);
3225      if (n === 0) {
3226
3227        // To ensure correct rounding when r.d is truncated, increment the last word if it is zero.
3228        n = r.d.length - 1;
3229        if (isTruncated && r.d[n] === 0) ++r.d[n];
3230        break;
3231      }
3232
3233      x = x.times(x);
3234      truncate(x.d, k);
3235    }
3236
3237    external = true;
3238
3239    return r;
3240  }
3241
3242
3243  function isOdd(n) {
3244    return n.d[n.d.length - 1] & 1;
3245  }
3246
3247
3248  /*
3249   * Handle `max` and `min`. `ltgt` is 'lt' or 'gt'.
3250   */
3251  function maxOrMin(Ctor, args, ltgt) {
3252    var y,
3253      x = new Ctor(args[0]),
3254      i = 0;
3255
3256    for (; ++i < args.length;) {
3257      y = new Ctor(args[i]);
3258      if (!y.s) {
3259        x = y;
3260        break;
3261      } else if (x[ltgt](y)) {
3262        x = y;
3263      }
3264    }
3265
3266    return x;
3267  }
3268
3269
3270  /*
3271   * Return a new Decimal whose value is the natural exponential of `x` rounded to `sd` significant
3272   * digits.
3273   *
3274   * Taylor/Maclaurin series.
3275   *
3276   * exp(x) = x^0/0! + x^1/1! + x^2/2! + x^3/3! + ...
3277   *
3278   * Argument reduction:
3279   *   Repeat x = x / 32, k += 5, until |x| < 0.1
3280   *   exp(x) = exp(x / 2^k)^(2^k)
3281   *
3282   * Previously, the argument was initially reduced by
3283   * exp(x) = exp(r) * 10^k  where r = x - k * ln10, k = floor(x / ln10)
3284   * to first put r in the range [0, ln10], before dividing by 32 until |x| < 0.1, but this was
3285   * found to be slower than just dividing repeatedly by 32 as above.
3286   *
3287   * Max integer argument: exp('20723265836946413') = 6.3e+9000000000000000
3288   * Min integer argument: exp('-20723265836946411') = 1.2e-9000000000000000
3289   * (Math object integer min/max: Math.exp(709) = 8.2e+307, Math.exp(-745) = 5e-324)
3290   *
3291   *  exp(Infinity)  = Infinity
3292   *  exp(-Infinity) = 0
3293   *  exp(NaN)       = NaN
3294   *  exp(±0)        = 1
3295   *
3296   *  exp(x) is non-terminating for any finite, non-zero x.
3297   *
3298   *  The result will always be correctly rounded.
3299   *
3300   */
3301  function naturalExponential(x, sd) {
3302    var denominator, guard, j, pow, sum, t, wpr,
3303      rep = 0,
3304      i = 0,
3305      k = 0,
3306      Ctor = x.constructor,
3307      rm = Ctor.rounding,
3308      pr = Ctor.precision;
3309
3310    // 0/NaN/Infinity?
3311    if (!x.d || !x.d[0] || x.e > 17) {
3312
3313      return new Ctor(x.d
3314        ? !x.d[0] ? 1 : x.s < 0 ? 0 : 1 / 0
3315        : x.s ? x.s < 0 ? 0 : x : 0 / 0);
3316    }
3317
3318    if (sd == null) {
3319      external = false;
3320      wpr = pr;
3321    } else {
3322      wpr = sd;
3323    }
3324
3325    t = new Ctor(0.03125);
3326
3327    // while abs(x) >= 0.1
3328    while (x.e > -2) {
3329
3330      // x = x / 2^5
3331      x = x.times(t);
3332      k += 5;
3333    }
3334
3335    // Use 2 * log10(2^k) + 5 (empirically derived) to estimate the increase in precision
3336    // necessary to ensure the first 4 rounding digits are correct.
3337    guard = Math.log(mathpow(2, k)) / Math.LN10 * 2 + 5 | 0;
3338    wpr += guard;
3339    denominator = pow = sum = new Ctor(1);
3340    Ctor.precision = wpr;
3341
3342    for (;;) {
3343      pow = finalise(pow.times(x), wpr, 1);
3344      denominator = denominator.times(++i);
3345      t = sum.plus(divide(pow, denominator, wpr, 1));
3346
3347      if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {
3348        j = k;
3349        while (j--) sum = finalise(sum.times(sum), wpr, 1);
3350
3351        // Check to see if the first 4 rounding digits are [49]999.
3352        // If so, repeat the summation with a higher precision, otherwise
3353        // e.g. with precision: 18, rounding: 1
3354        // exp(18.404272462595034083567793919843761) = 98372560.1229999999 (should be 98372560.123)
vendor: 16,612 bytes, lines 3355-4007
3355        // `wpr - guard` is the index of first rounding digit.
3356        if (sd == null) {
3357
3358          if (rep < 3 && checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {
3359            Ctor.precision = wpr += 10;
3360            denominator = pow = t = new Ctor(1);
3361            i = 0;
3362            rep++;
3363          } else {
3364            return finalise(sum, Ctor.precision = pr, rm, external = true);
3365          }
3366        } else {
3367          Ctor.precision = pr;
3368          return sum;
3369        }
3370      }
3371
3372      sum = t;
3373    }
3374  }
3375
3376
3377  /*
3378   * Return a new Decimal whose value is the natural logarithm of `x` rounded to `sd` significant
3379   * digits.
3380   *
3381   *  ln(-n)        = NaN
3382   *  ln(0)         = -Infinity
3383   *  ln(-0)        = -Infinity
3384   *  ln(1)         = 0
3385   *  ln(Infinity)  = Infinity
3386   *  ln(-Infinity) = NaN
3387   *  ln(NaN)       = NaN
3388   *
3389   *  ln(n) (n != 1) is non-terminating.
3390   *
3391   */
3392  function naturalLogarithm(y, sd) {
3393    var c, c0, denominator, e, numerator, rep, sum, t, wpr, x1, x2,
3394      n = 1,
3395      guard = 10,
3396      x = y,
3397      xd = x.d,
3398      Ctor = x.constructor,
3399      rm = Ctor.rounding,
3400      pr = Ctor.precision;
3401
3402    // Is x negative or Infinity, NaN, 0 or 1?
3403    if (x.s < 0 || !xd || !xd[0] || !x.e && xd[0] == 1 && xd.length == 1) {
3404      return new Ctor(xd && !xd[0] ? -1 / 0 : x.s != 1 ? NaN : xd ? 0 : x);
3405    }
3406
3407    if (sd == null) {
3408      external = false;
3409      wpr = pr;
3410    } else {
3411      wpr = sd;
3412    }
3413
3414    Ctor.precision = wpr += guard;
3415    c = digitsToString(xd);
3416    c0 = c.charAt(0);
3417
3418    if (Math.abs(e = x.e) < 1.5e15) {
3419
3420      // Argument reduction.
3421      // The series converges faster the closer the argument is to 1, so using
3422      // ln(a^b) = b * ln(a),   ln(a) = ln(a^b) / b
3423      // multiply the argument by itself until the leading digits of the significand are 7, 8, 9,
3424      // 10, 11, 12 or 13, recording the number of multiplications so the sum of the series can
3425      // later be divided by this number, then separate out the power of 10 using
3426      // ln(a*10^b) = ln(a) + b*ln(10).
3427
3428      // max n is 21 (gives 0.9, 1.0 or 1.1) (9e15 / 21 = 4.2e14).
3429      //while (c0 < 9 && c0 != 1 || c0 == 1 && c.charAt(1) > 1) {
3430      // max n is 6 (gives 0.7 - 1.3)
3431      while (c0 < 7 && c0 != 1 || c0 == 1 && c.charAt(1) > 3) {
3432        x = x.times(y);
3433        c = digitsToString(x.d);
3434        c0 = c.charAt(0);
3435        n++;
3436      }
3437
3438      e = x.e;
3439
3440      if (c0 > 1) {
3441        x = new Ctor('0.' + c);
3442        e++;
3443      } else {
3444        x = new Ctor(c0 + '.' + c.slice(1));
3445      }
3446    } else {
3447
3448      // The argument reduction method above may result in overflow if the argument y is a massive
3449      // number with exponent >= 1500000000000000 (9e15 / 6 = 1.5e15), so instead recall this
3450      // function using ln(x*10^e) = ln(x) + e*ln(10).
3451      t = getLn10(Ctor, wpr + 2, pr).times(e + '');
3452      x = naturalLogarithm(new Ctor(c0 + '.' + c.slice(1)), wpr - guard).plus(t);
3453      Ctor.precision = pr;
3454
3455      return sd == null ? finalise(x, pr, rm, external = true) : x;
3456    }
3457
3458    // x1 is x reduced to a value near 1.
3459    x1 = x;
3460
3461    // Taylor series.
3462    // ln(y) = ln((1 + x)/(1 - x)) = 2(x + x^3/3 + x^5/5 + x^7/7 + ...)
3463    // where x = (y - 1)/(y + 1)    (|x| < 1)
3464    sum = numerator = x = divide(x.minus(1), x.plus(1), wpr, 1);
3465    x2 = finalise(x.times(x), wpr, 1);
3466    denominator = 3;
3467
3468    for (;;) {
3469      numerator = finalise(numerator.times(x2), wpr, 1);
3470      t = sum.plus(divide(numerator, new Ctor(denominator), wpr, 1));
3471
3472      if (digitsToString(t.d).slice(0, wpr) === digitsToString(sum.d).slice(0, wpr)) {
3473        sum = sum.times(2);
3474
3475        // Reverse the argument reduction. Check that e is not 0 because, besides preventing an
3476        // unnecessary calculation, -0 + 0 = +0 and to ensure correct rounding -0 needs to stay -0.
3477        if (e !== 0) sum = sum.plus(getLn10(Ctor, wpr + 2, pr).times(e + ''));
3478        sum = divide(sum, new Ctor(n), wpr, 1);
3479
3480        // Is rm > 3 and the first 4 rounding digits 4999, or rm < 4 (or the summation has
3481        // been repeated previously) and the first 4 rounding digits 9999?
3482        // If so, restart the summation with a higher precision, otherwise
3483        // e.g. with precision: 12, rounding: 1
3484        // ln(135520028.6126091714265381533) = 18.7246299999 when it should be 18.72463.
3485        // `wpr - guard` is the index of first rounding digit.
3486        if (sd == null) {
3487          if (checkRoundingDigits(sum.d, wpr - guard, rm, rep)) {
3488            Ctor.precision = wpr += guard;
3489            t = numerator = x = divide(x1.minus(1), x1.plus(1), wpr, 1);
3490            x2 = finalise(x.times(x), wpr, 1);
3491            denominator = rep = 1;
3492          } else {
3493            return finalise(sum, Ctor.precision = pr, rm, external = true);
3494          }
3495        } else {
3496          Ctor.precision = pr;
3497          return sum;
3498        }
3499      }
3500
3501      sum = t;
3502      denominator += 2;
3503    }
3504  }
3505
3506
3507  // ±Infinity, NaN.
3508  function nonFiniteToString(x) {
3509    // Unsigned.
3510    return String(x.s * x.s / 0);
3511  }
3512
3513
3514  /*
3515   * Parse the value of a new Decimal `x` from string `str`.
3516   */
3517  function parseDecimal(x, str) {
3518    var e, i, len;
3519
3520    // Decimal point?
3521    if ((e = str.indexOf('.')) > -1) str = str.replace('.', '');
3522
3523    // Exponential form?
3524    if ((i = str.search(/e/i)) > 0) {
3525
3526      // Determine exponent.
3527      if (e < 0) e = i;
3528      e += +str.slice(i + 1);
3529      str = str.substring(0, i);
3530    } else if (e < 0) {
3531
3532      // Integer.
3533      e = str.length;
3534    }
3535
3536    // Determine leading zeros.
3537    for (i = 0; str.charCodeAt(i) === 48; i++);
3538
3539    // Determine trailing zeros.
3540    for (len = str.length; str.charCodeAt(len - 1) === 48; --len);
3541    str = str.slice(i, len);
3542
3543    if (str) {
3544      len -= i;
3545      x.e = e = e - i - 1;
3546      x.d = [];
3547
3548      // Transform base
3549
3550      // e is the base 10 exponent.
3551      // i is where to slice str to get the first word of the digits array.
3552      i = (e + 1) % LOG_BASE;
3553      if (e < 0) i += LOG_BASE;
3554
3555      if (i < len) {
3556        if (i) x.d.push(+str.slice(0, i));
3557        for (len -= LOG_BASE; i < len;) x.d.push(+str.slice(i, i += LOG_BASE));
3558        str = str.slice(i);
3559        i = LOG_BASE - str.length;
3560      } else {
3561        i -= len;
3562      }
3563
3564      for (; i--;) str += '0';
3565      x.d.push(+str);
3566
3567      if (external) {
3568
3569        // Overflow?
3570        if (x.e > x.constructor.maxE) {
3571
3572          // Infinity.
3573          x.d = null;
3574          x.e = NaN;
3575
3576        // Underflow?
3577        } else if (x.e < x.constructor.minE) {
3578
3579          // Zero.
3580          x.e = 0;
3581          x.d = [0];
3582          // x.constructor.underflow = true;
3583        } // else x.constructor.underflow = false;
3584      }
3585    } else {
3586
3587      // Zero.
3588      x.e = 0;
3589      x.d = [0];
3590    }
3591
3592    return x;
3593  }
3594
3595
3596  /*
3597   * Parse the value of a new Decimal `x` from a string `str`, which is not a decimal value.
3598   */
3599  function parseOther(x, str) {
3600    var base, Ctor, divisor, i, isFloat, len, p, xd, xe;
3601
3602    if (str.indexOf('_') > -1) {
3603      str = str.replace(/(\d)_(?=\d)/g, '$1');
3604      if (isDecimal.test(str)) return parseDecimal(x, str);
3605    } else if (str === 'Infinity' || str === 'NaN') {
3606      if (!+str) x.s = NaN;
3607      x.e = NaN;
3608      x.d = null;
3609      return x;
3610    }
3611
3612    if (isHex.test(str))  {
3613      base = 16;
3614      str = str.toLowerCase();
3615    } else if (isBinary.test(str))  {
3616      base = 2;
3617    } else if (isOctal.test(str))  {
3618      base = 8;
3619    } else {
3620      throw Error(invalidArgument + str);
3621    }
3622
3623    // Is there a binary exponent part?
3624    i = str.search(/p/i);
3625
3626    if (i > 0) {
3627      p = +str.slice(i + 1);
3628      str = str.substring(2, i);
3629    } else {
3630      str = str.slice(2);
3631    }
3632
3633    // Convert `str` as an integer then divide the result by `base` raised to a power such that the
3634    // fraction part will be restored.
3635    i = str.indexOf('.');
3636    isFloat = i >= 0;
3637    Ctor = x.constructor;
3638
3639    if (isFloat) {
3640      str = str.replace('.', '');
3641      len = str.length;
3642      i = len - i;
3643
3644      // log[10](16) = 1.2041... , log[10](88) = 1.9444....
3645      divisor = intPow(Ctor, new Ctor(base), i, i * 2);
3646    }
3647
3648    xd = convertBase(str, base, BASE);
3649    xe = xd.length - 1;
3650
3651    // Remove trailing zeros.
3652    for (i = xe; xd[i] === 0; --i) xd.pop();
3653    if (i < 0) return new Ctor(x.s * 0);
3654    x.e = getBase10Exponent(xd, xe);
3655    x.d = xd;
3656    external = false;
3657
3658    // At what precision to perform the division to ensure exact conversion?
3659    // maxDecimalIntegerPartDigitCount = ceil(log[10](b) * otherBaseIntegerPartDigitCount)
3660    // log[10](2) = 0.30103, log[10](8) = 0.90309, log[10](16) = 1.20412
3661    // E.g. ceil(1.2 * 3) = 4, so up to 4 decimal digits are needed to represent 3 hex int digits.
3662    // maxDecimalFractionPartDigitCount = {Hex:4|Oct:3|Bin:1} * otherBaseFractionPartDigitCount
3663    // Therefore using 4 * the number of digits of str will always be enough.
3664    if (isFloat) x = divide(x, divisor, len * 4);
3665
3666    // Multiply by the binary exponent part if present.
3667    if (p) x = x.times(Math.abs(p) < 54 ? mathpow(2, p) : Decimal.pow(2, p));
3668    external = true;
3669
3670    return x;
3671  }
3672
3673
3674  /*
3675   * sin(x) = x - x^3/3! + x^5/5! - ...
3676   * |x| < pi/2
3677   *
3678   */
3679  function sine(Ctor, x) {
3680    var k,
3681      len = x.d.length;
3682
3683    if (len < 3) {
3684      return x.isZero() ? x : taylorSeries(Ctor, 2, x, x);
3685    }
3686
3687    // Argument reduction: sin(5x) = 16*sin^5(x) - 20*sin^3(x) + 5*sin(x)
3688    // i.e. sin(x) = 16*sin^5(x/5) - 20*sin^3(x/5) + 5*sin(x/5)
3689    // and  sin(x) = sin(x/5)(5 + sin^2(x/5)(16sin^2(x/5) - 20))
3690
3691    // Estimate the optimum number of times to use the argument reduction.
3692    k = 1.4 * Math.sqrt(len);
3693    k = k > 16 ? 16 : k | 0;
3694
3695    x = x.times(1 / tinyPow(5, k));
3696    x = taylorSeries(Ctor, 2, x, x);
3697
3698    // Reverse argument reduction
3699    var sin2_x,
3700      d5 = new Ctor(5),
3701      d16 = new Ctor(16),
3702      d20 = new Ctor(20);
3703    for (; k--;) {
3704      sin2_x = x.times(x);
3705      x = x.times(d5.plus(sin2_x.times(d16.times(sin2_x).minus(d20))));
3706    }
3707
3708    return x;
3709  }
3710
3711
3712  // Calculate Taylor series for `cos`, `cosh`, `sin` and `sinh`.
3713  function taylorSeries(Ctor, n, x, y, isHyperbolic) {
3714    var j, t, u, x2,
3715      i = 1,
3716      pr = Ctor.precision,
3717      k = Math.ceil(pr / LOG_BASE);
3718
3719    external = false;
3720    x2 = x.times(x);
3721    u = new Ctor(y);
3722
3723    for (;;) {
3724      t = divide(u.times(x2), new Ctor(n++ * n++), pr, 1);
3725      u = isHyperbolic ? y.plus(t) : y.minus(t);
3726      y = divide(t.times(x2), new Ctor(n++ * n++), pr, 1);
3727      t = u.plus(y);
3728
3729      if (t.d[k] !== void 0) {
3730        for (j = k; t.d[j] === u.d[j] && j--;);
3731        if (j == -1) break;
3732      }
3733
3734      j = u;
3735      u = y;
3736      y = t;
3737      t = j;
3738      i++;
3739    }
3740
3741    external = true;
3742    t.d.length = k + 1;
3743
3744    return t;
3745  }
3746
3747
3748  // Exponent e must be positive and non-zero.
3749  function tinyPow(b, e) {
3750    var n = b;
3751    while (--e) n *= b;
3752    return n;
3753  }
3754
3755
3756  // Return the absolute value of `x` reduced to less than or equal to half pi.
3757  function toLessThanHalfPi(Ctor, x) {
3758    var t,
3759      isNeg = x.s < 0,
3760      pi = getPi(Ctor, Ctor.precision, 1),
3761      halfPi = pi.times(0.5);
3762
3763    x = x.abs();
3764
3765    if (x.lte(halfPi)) {
3766      quadrant = isNeg ? 4 : 1;
3767      return x;
3768    }
3769
3770    t = x.divToInt(pi);
3771
3772    if (t.isZero()) {
3773      quadrant = isNeg ? 3 : 2;
3774    } else {
3775      x = x.minus(t.times(pi));
3776
3777      // 0 <= x < pi
3778      if (x.lte(halfPi)) {
3779        quadrant = isOdd(t) ? (isNeg ? 2 : 3) : (isNeg ? 4 : 1);
3780        return x;
3781      }
3782
3783      quadrant = isOdd(t) ? (isNeg ? 1 : 4) : (isNeg ? 3 : 2);
3784    }
3785
3786    return x.minus(pi).abs();
3787  }
3788
3789
3790  /*
3791   * Return the value of Decimal `x` as a string in base `baseOut`.
3792   *
3793   * If the optional `sd` argument is present include a binary exponent suffix.
3794   */
3795  function toStringBinary(x, baseOut, sd, rm) {
3796    var base, e, i, k, len, roundUp, str, xd, y,
3797      Ctor = x.constructor,
3798      isExp = sd !== void 0;
3799
3800    if (isExp) {
3801      checkInt32(sd, 1, MAX_DIGITS);
3802      if (rm === void 0) rm = Ctor.rounding;
3803      else checkInt32(rm, 0, 8);
3804    } else {
3805      sd = Ctor.precision;
3806      rm = Ctor.rounding;
3807    }
3808
3809    if (!x.isFinite()) {
3810      str = nonFiniteToString(x);
3811    } else {
3812      str = finiteToString(x);
3813      i = str.indexOf('.');
3814
3815      // Use exponential notation according to `toExpPos` and `toExpNeg`? No, but if required:
3816      // maxBinaryExponent = floor((decimalExponent + 1) * log[2](10))
3817      // minBinaryExponent = floor(decimalExponent * log[2](10))
3818      // log[2](10) = 3.321928094887362347870319429489390175864
3819
3820      if (isExp) {
3821        base = 2;
3822        if (baseOut == 16) {
3823          sd = sd * 4 - 3;
3824        } else if (baseOut == 8) {
3825          sd = sd * 3 - 2;
3826        }
3827      } else {
3828        base = baseOut;
3829      }
3830
3831      // Convert the number as an integer then divide the result by its base raised to a power such
3832      // that the fraction part will be restored.
3833
3834      // Non-integer.
3835      if (i >= 0) {
3836        str = str.replace('.', '');
3837        y = new Ctor(1);
3838        y.e = str.length - i;
3839        y.d = convertBase(finiteToString(y), 10, base);
3840        y.e = y.d.length;
3841      }
3842
3843      xd = convertBase(str, 10, base);
3844      e = len = xd.length;
3845
3846      // Remove trailing zeros.
3847      for (; xd[--len] == 0;) xd.pop();
3848
3849      if (!xd[0]) {
3850        str = isExp ? '0p+0' : '0';
3851      } else {
3852        if (i < 0) {
3853          e--;
3854        } else {
3855          x = new Ctor(x);
3856          x.d = xd;
3857          x.e = e;
3858          x = divide(x, y, sd, rm, 0, base);
3859          xd = x.d;
3860          e = x.e;
3861          roundUp = inexact;
3862        }
3863
3864        // The rounding digit, i.e. the digit after the digit that may be rounded up.
3865        i = xd[sd];
3866        k = base / 2;
3867        roundUp = roundUp || xd[sd + 1] !== void 0;
3868
3869        roundUp = rm < 4
3870          ? (i !== void 0 || roundUp) && (rm === 0 || rm === (x.s < 0 ? 3 : 2))
3871          : i > k || i === k && (rm === 4 || roundUp || rm === 6 && xd[sd - 1] & 1 ||
3872            rm === (x.s < 0 ? 8 : 7));
3873
3874        xd.length = sd;
3875
3876        if (roundUp) {
3877
3878          // Rounding up may mean the previous digit has to be rounded up and so on.
3879          for (; ++xd[--sd] > base - 1;) {
3880            xd[sd] = 0;
3881            if (!sd) {
3882              ++e;
3883              xd.unshift(1);
3884            }
3885          }
3886        }
3887
3888        // Determine trailing zeros.
3889        for (len = xd.length; !xd[len - 1]; --len);
3890
3891        // E.g. [4, 11, 15] becomes 4bf.
3892        for (i = 0, str = ''; i < len; i++) str += NUMERALS.charAt(xd[i]);
3893
3894        // Add binary exponent suffix?
3895        if (isExp) {
3896          if (len > 1) {
3897            if (baseOut == 16 || baseOut == 8) {
3898              i = baseOut == 16 ? 4 : 3;
3899              for (--len; len % i; len++) str += '0';
3900              xd = convertBase(str, base, baseOut);
3901              for (len = xd.length; !xd[len - 1]; --len);
3902
3903              // xd[0] will always be be 1
3904              for (i = 1, str = '1.'; i < len; i++) str += NUMERALS.charAt(xd[i]);
3905            } else {
3906              str = str.charAt(0) + '.' + str.slice(1);
3907            }
3908          }
3909
3910          str =  str + (e < 0 ? 'p' : 'p+') + e;
3911        } else if (e < 0) {
3912          for (; ++e;) str = '0' + str;
3913          str = '0.' + str;
3914        } else {
3915          if (++e > len) for (e -= len; e-- ;) str += '0';
3916          else if (e < len) str = str.slice(0, e) + '.' + str.slice(e);
3917        }
3918      }
3919
3920      str = (baseOut == 16 ? '0x' : baseOut == 2 ? '0b' : baseOut == 8 ? '0o' : '') + str;
3921    }
3922
3923    return x.s < 0 ? '-' + str : str;
3924  }
3925
3926
3927  // Does not strip trailing zeros.
3928  function truncate(arr, len) {
3929    if (arr.length > len) {
3930      arr.length = len;
3931      return true;
3932    }
3933  }
3934
3935
3936  // Decimal methods
3937
3938
3939  /*
3940   *  abs
3941   *  acos
3942   *  acosh
3943   *  add
3944   *  asin
3945   *  asinh
3946   *  atan
3947   *  atanh
3948   *  atan2
3949   *  cbrt
3950   *  ceil
3951   *  clamp
3952   *  clone
3953   *  config
3954   *  cos
3955   *  cosh
3956   *  div
3957   *  exp
3958   *  floor
3959   *  hypot
3960   *  ln
3961   *  log
3962   *  log2
3963   *  log10
3964   *  max
3965   *  min
3966   *  mod
3967   *  mul
3968   *  pow
3969   *  random
3970   *  round
3971   *  set
3972   *  sign
3973   *  sin
3974   *  sinh
3975   *  sqrt
3976   *  sub
3977   *  sum
3978   *  tan
3979   *  tanh
3980   *  trunc
3981   */
3982
3983
3984  /*
3985   * Return a new Decimal whose value is the absolute value of `x`.
3986   *
3987   * x {number|string|Decimal}
3988   *
3989   */
3990  function abs(x) {
3991    return new this(x).abs();
3992  }
3993
3994
3995  /*
3996   * Return a new Decimal whose value is the arccosine in radians of `x`.
3997   *
3998   * x {number|string|Decimal}
3999   *
4000   */
4001  function acos(x) {
4002    return new this(x).acos();
4003  }
4004
4005
4006  /*
4007   * Return a new Decimal whose value is the inverse of the hyperbolic cosine of `x`, rounded to
4008   * `precision` significant digits using rounding mode `rounding`.
4009   *
4010   * x {number|string|Decimal} A value in radians.
4011   *
4012   */
4013  function acosh(x) {
4014    return new this(x).acosh();
4015  }
4016
4017
4018  /*
4019   * Return a new Decimal whose value is the sum of `x` and `y`, rounded to `precision` significant
4020   * digits using rounding mode `rounding`.
4021   *
4022   * x {number|string|Decimal}
4023   * y {number|string|Decimal}
4024   *
4025   */
4026  function add(x, y) {
4027    return new this(x).plus(y);
4028  }
4029
4030
4031  /*
4032   * Return a new Decimal whose value is the arcsine in radians of `x`, rounded to `precision`
4033   * significant digits using rounding mode `rounding`.
4034   *
4035   * x {number|string|Decimal}
4036   *
4037   */
4038  function asin(x) {
4039    return new this(x).asin();
4040  }
4041
4042
4043  /*
4044   * Return a new Decimal whose value is the inverse of the hyperbolic sine of `x`, rounded to
4045   * `precision` significant digits using rounding mode `rounding`.
4046   *
4047   * x {number|string|Decimal} A value in radians.
4048   *
4049   */
4050  function asinh(x) {
4051    return new this(x).asinh();
4052  }
4053
4054
4055  /*
4056   * Return a new Decimal whose value is the arctangent in radians of `x`, rounded to `precision`
vendor: 5,002 bytes, lines 4057-4247
4057   * significant digits using rounding mode `rounding`.
4058   *
4059   * x {number|string|Decimal}
4060   *
4061   */
4062  function atan(x) {
4063    return new this(x).atan();
4064  }
4065
4066
4067  /*
4068   * Return a new Decimal whose value is the inverse of the hyperbolic tangent of `x`, rounded to
4069   * `precision` significant digits using rounding mode `rounding`.
4070   *
4071   * x {number|string|Decimal} A value in radians.
4072   *
4073   */
4074  function atanh(x) {
4075    return new this(x).atanh();
4076  }
4077
4078
4079  /*
4080   * Return a new Decimal whose value is the arctangent in radians of `y/x` in the range -pi to pi
4081   * (inclusive), rounded to `precision` significant digits using rounding mode `rounding`.
4082   *
4083   * Domain: [-Infinity, Infinity]
4084   * Range: [-pi, pi]
4085   *
4086   * y {number|string|Decimal} The y-coordinate.
4087   * x {number|string|Decimal} The x-coordinate.
4088   *
4089   * atan2(±0, -0)               = ±pi
4090   * atan2(±0, +0)               = ±0
4091   * atan2(±0, -x)               = ±pi for x > 0
4092   * atan2(±0, x)                = ±0 for x > 0
4093   * atan2(-y, ±0)               = -pi/2 for y > 0
4094   * atan2(y, ±0)                = pi/2 for y > 0
4095   * atan2(±y, -Infinity)        = ±pi for finite y > 0
4096   * atan2(±y, +Infinity)        = ±0 for finite y > 0
4097   * atan2(±Infinity, x)         = ±pi/2 for finite x
4098   * atan2(±Infinity, -Infinity) = ±3*pi/4
4099   * atan2(±Infinity, +Infinity) = ±pi/4
4100   * atan2(NaN, x) = NaN
4101   * atan2(y, NaN) = NaN
4102   *
4103   */
4104  function atan2(y, x) {
4105    y = new this(y);
4106    x = new this(x);
4107    var r,
4108      pr = this.precision,
4109      rm = this.rounding,
4110      wpr = pr + 4;
4111
4112    // Either NaN
4113    if (!y.s || !x.s) {
4114      r = new this(NaN);
4115
4116    // Both ±Infinity
4117    } else if (!y.d && !x.d) {
4118      r = getPi(this, wpr, 1).times(x.s > 0 ? 0.25 : 0.75);
4119      r.s = y.s;
4120
4121    // x is ±Infinity or y is ±0
4122    } else if (!x.d || y.isZero()) {
4123      r = x.s < 0 ? getPi(this, pr, rm) : new this(0);
4124      r.s = y.s;
4125
4126    // y is ±Infinity or x is ±0
4127    } else if (!y.d || x.isZero()) {
4128      r = getPi(this, wpr, 1).times(0.5);
4129      r.s = y.s;
4130
4131    // Both non-zero and finite
4132    } else if (x.s < 0) {
4133      this.precision = wpr;
4134      this.rounding = 1;
4135      r = this.atan(divide(y, x, wpr, 1));
4136      x = getPi(this, wpr, 1);
4137      this.precision = pr;
4138      this.rounding = rm;
4139      r = y.s < 0 ? r.minus(x) : r.plus(x);
4140    } else {
4141      r = this.atan(divide(y, x, wpr, 1));
4142    }
4143
4144    return r;
4145  }
4146
4147
4148  /*
4149   * Return a new Decimal whose value is the cube root of `x`, rounded to `precision` significant
4150   * digits using rounding mode `rounding`.
4151   *
4152   * x {number|string|Decimal}
4153   *
4154   */
4155  function cbrt(x) {
4156    return new this(x).cbrt();
4157  }
4158
4159
4160  /*
4161   * Return a new Decimal whose value is `x` rounded to an integer using `ROUND_CEIL`.
4162   *
4163   * x {number|string|Decimal}
4164   *
4165   */
4166  function ceil(x) {
4167    return finalise(x = new this(x), x.e + 1, 2);
4168  }
4169
4170
4171  /*
4172   * Return a new Decimal whose value is `x` clamped to the range delineated by `min` and `max`.
4173   *
4174   * x {number|string|Decimal}
4175   * min {number|string|Decimal}
4176   * max {number|string|Decimal}
4177   *
4178   */
4179  function clamp(x, min, max) {
4180    return new this(x).clamp(min, max);
4181  }
4182
4183
4184  /*
4185   * Configure global settings for a Decimal constructor.
4186   *
4187   * `obj` is an object with one or more of the following properties,
4188   *
4189   *   precision  {number}
4190   *   rounding   {number}
4191   *   toExpNeg   {number}
4192   *   toExpPos   {number}
4193   *   maxE       {number}
4194   *   minE       {number}
4195   *   modulo     {number}
4196   *   crypto     {boolean|number}
4197   *   defaults   {true}
4198   *
4199   * E.g. Decimal.config({ precision: 20, rounding: 4 })
4200   *
4201   */
4202  function config(obj) {
4203    if (!obj || typeof obj !== 'object') throw Error(decimalError + 'Object expected');
4204    var i, p, v,
4205      useDefaults = obj.defaults === true,
4206      ps = [
4207        'precision', 1, MAX_DIGITS,
4208        'rounding', 0, 8,
4209        'toExpNeg', -EXP_LIMIT, 0,
4210        'toExpPos', 0, EXP_LIMIT,
4211        'maxE', 0, EXP_LIMIT,
4212        'minE', -EXP_LIMIT, 0,
4213        'modulo', 0, 9
4214      ];
4215
4216    for (i = 0; i < ps.length; i += 3) {
4217      if (p = ps[i], useDefaults) this[p] = DEFAULTS[p];
4218      if ((v = obj[p]) !== void 0) {
4219        if (mathfloor(v) === v && v >= ps[i + 1] && v <= ps[i + 2]) this[p] = v;
4220        else throw Error(invalidArgument + p + ': ' + v);
4221      }
4222    }
4223
4224    if (p = 'crypto', useDefaults) this[p] = DEFAULTS[p];
4225    if ((v = obj[p]) !== void 0) {
4226      if (v === true || v === false || v === 0 || v === 1) {
4227        if (v) {
4228          if (typeof crypto != 'undefined' && crypto &&
4229            (crypto.getRandomValues || crypto.randomBytes)) {
4230            this[p] = true;
4231          } else {
4232            throw Error(cryptoUnavailable);
4233          }
4234        } else {
4235          this[p] = false;
4236        }
4237      } else {
4238        throw Error(invalidArgument + p + ': ' + v);
4239      }
4240    }
4241
4242    return this;
4243  }
4244
4245
4246  /*
4247   * Return a new Decimal whose value is the cosine of `x`, rounded to `precision` significant
vendor: 5,021 bytes, lines 4248-4460
4248   * digits using rounding mode `rounding`.
4249   *
4250   * x {number|string|Decimal} A value in radians.
4251   *
4252   */
4253  function cos(x) {
4254    return new this(x).cos();
4255  }
4256
4257
4258  /*
4259   * Return a new Decimal whose value is the hyperbolic cosine of `x`, rounded to precision
4260   * significant digits using rounding mode `rounding`.
4261   *
4262   * x {number|string|Decimal} A value in radians.
4263   *
4264   */
4265  function cosh(x) {
4266    return new this(x).cosh();
4267  }
4268
4269
4270  /*
4271   * Create and return a Decimal constructor with the same configuration properties as this Decimal
4272   * constructor.
4273   *
4274   */
4275  function clone(obj) {
4276    var i, p, ps;
4277
4278    /*
4279     * The Decimal constructor and exported function.
4280     * Return a new Decimal instance.
4281     *
4282     * v {number|string|Decimal} A numeric value.
4283     *
4284     */
4285    function Decimal(v) {
4286      var e, i, t,
4287        x = this;
4288
4289      // Decimal called without new.
4290      if (!(x instanceof Decimal)) return new Decimal(v);
4291
4292      // Retain a reference to this Decimal constructor, and shadow Decimal.prototype.constructor
4293      // which points to Object.
4294      x.constructor = Decimal;
4295
4296      // Duplicate.
4297      if (isDecimalInstance(v)) {
4298        x.s = v.s;
4299
4300        if (external) {
4301          if (!v.d || v.e > Decimal.maxE) {
4302
4303            // Infinity.
4304            x.e = NaN;
4305            x.d = null;
4306          } else if (v.e < Decimal.minE) {
4307
4308            // Zero.
4309            x.e = 0;
4310            x.d = [0];
4311          } else {
4312            x.e = v.e;
4313            x.d = v.d.slice();
4314          }
4315        } else {
4316          x.e = v.e;
4317          x.d = v.d ? v.d.slice() : v.d;
4318        }
4319
4320        return;
4321      }
4322
4323      t = typeof v;
4324
4325      if (t === 'number') {
4326        if (v === 0) {
4327          x.s = 1 / v < 0 ? -1 : 1;
4328          x.e = 0;
4329          x.d = [0];
4330          return;
4331        }
4332
4333        if (v < 0) {
4334          v = -v;
4335          x.s = -1;
4336        } else {
4337          x.s = 1;
4338        }
4339
4340        // Fast path for small integers.
4341        if (v === ~~v && v < 1e7) {
4342          for (e = 0, i = v; i >= 10; i /= 10) e++;
4343
4344          if (external) {
4345            if (e > Decimal.maxE) {
4346              x.e = NaN;
4347              x.d = null;
4348            } else if (e < Decimal.minE) {
4349              x.e = 0;
4350              x.d = [0];
4351            } else {
4352              x.e = e;
4353              x.d = [v];
4354            }
4355          } else {
4356            x.e = e;
4357            x.d = [v];
4358          }
4359
4360          return;
4361
4362        // Infinity, NaN.
4363        } else if (v * 0 !== 0) {
4364          if (!v) x.s = NaN;
4365          x.e = NaN;
4366          x.d = null;
4367          return;
4368        }
4369
4370        return parseDecimal(x, v.toString());
4371
4372      } else if (t !== 'string') {
4373        throw Error(invalidArgument + v);
4374      }
4375
4376      // Minus sign?
4377      if ((i = v.charCodeAt(0)) === 45) {
4378        v = v.slice(1);
4379        x.s = -1;
4380      } else {
4381        // Plus sign?
4382        if (i === 43) v = v.slice(1);
4383        x.s = 1;
4384      }
4385
4386      return isDecimal.test(v) ? parseDecimal(x, v) : parseOther(x, v);
4387    }
4388
4389    Decimal.prototype = P;
4390
4391    Decimal.ROUND_UP = 0;
4392    Decimal.ROUND_DOWN = 1;
4393    Decimal.ROUND_CEIL = 2;
4394    Decimal.ROUND_FLOOR = 3;
4395    Decimal.ROUND_HALF_UP = 4;
4396    Decimal.ROUND_HALF_DOWN = 5;
4397    Decimal.ROUND_HALF_EVEN = 6;
4398    Decimal.ROUND_HALF_CEIL = 7;
4399    Decimal.ROUND_HALF_FLOOR = 8;
4400    Decimal.EUCLID = 9;
4401
4402    Decimal.config = Decimal.set = config;
4403    Decimal.clone = clone;
4404    Decimal.isDecimal = isDecimalInstance;
4405
4406    Decimal.abs = abs;
4407    Decimal.acos = acos;
4408    Decimal.acosh = acosh;        // ES6
4409    Decimal.add = add;
4410    Decimal.asin = asin;
4411    Decimal.asinh = asinh;        // ES6
4412    Decimal.atan = atan;
4413    Decimal.atanh = atanh;        // ES6
4414    Decimal.atan2 = atan2;
4415    Decimal.cbrt = cbrt;          // ES6
4416    Decimal.ceil = ceil;
4417    Decimal.clamp = clamp;
4418    Decimal.cos = cos;
4419    Decimal.cosh = cosh;          // ES6
4420    Decimal.div = div;
4421    Decimal.exp = exp;
4422    Decimal.floor = floor;
4423    Decimal.hypot = hypot;        // ES6
4424    Decimal.ln = ln;
4425    Decimal.log = log;
4426    Decimal.log10 = log10;        // ES6
4427    Decimal.log2 = log2;          // ES6
4428    Decimal.max = max;
4429    Decimal.min = min;
4430    Decimal.mod = mod;
4431    Decimal.mul = mul;
4432    Decimal.pow = pow;
4433    Decimal.random = random;
4434    Decimal.round = round;
4435    Decimal.sign = sign;          // ES6
4436    Decimal.sin = sin;
4437    Decimal.sinh = sinh;          // ES6
4438    Decimal.sqrt = sqrt;
4439    Decimal.sub = sub;
4440    Decimal.sum = sum;
4441    Decimal.tan = tan;
4442    Decimal.tanh = tanh;          // ES6
4443    Decimal.trunc = trunc;        // ES6
4444
4445    if (obj === void 0) obj = {};
4446    if (obj) {
4447      if (obj.defaults !== true) {
4448        ps = ['precision', 'rounding', 'toExpNeg', 'toExpPos', 'maxE', 'minE', 'modulo', 'crypto'];
4449        for (i = 0; i < ps.length;) if (!obj.hasOwnProperty(p = ps[i++])) obj[p] = this[p];
4450      }
4451    }
4452
4453    Decimal.config(obj);
4454
4455    return Decimal;
4456  }
4457
4458
4459  /*
4460   * Return a new Decimal whose value is `x` divided by `y`, rounded to `precision` significant
4461   * digits using rounding mode `rounding`.
4462   *
4463   * x {number|string|Decimal}
4464   * y {number|string|Decimal}
4465   *
4466   */
4467  function div(x, y) {
4468    return new this(x).div(y);
4469  }
4470
4471
4472  /*
4473   * Return a new Decimal whose value is the natural exponential of `x`, rounded to `precision`
4474   * significant digits using rounding mode `rounding`.
4475   *
4476   * x {number|string|Decimal} The power to which to raise the base of the natural log.
4477   *
4478   */
4479  function exp(x) {
4480    return new this(x).exp();
4481  }
4482
4483
4484  /*
4485   * Return a new Decimal whose value is `x` round to an integer using `ROUND_FLOOR`.
4486   *
4487   * x {number|string|Decimal}
4488   *
4489   */
4490  function floor(x) {
4491    return finalise(x = new this(x), x.e + 1, 3);
4492  }
4493
4494
4495  /*
4496   * Return a new Decimal whose value is the square root of the sum of the squares of the arguments,
4497   * rounded to `precision` significant digits using rounding mode `rounding`.
4498   *
4499   * hypot(a, b, ...) = sqrt(a^2 + b^2 + ...)
4500   *
4501   * arguments {number|string|Decimal}
4502   *
4503   */
4504  function hypot() {
4505    var i, n,
4506      t = new this(0);
4507
4508    external = false;
4509
4510    for (i = 0; i < arguments.length;) {
4511      n = new this(arguments[i++]);
4512      if (!n.d) {
4513        if (n.s) {
4514          external = true;
4515          return new this(1 / 0);
4516        }
4517        t = n;
4518      } else if (t.d) {
4519        t = t.plus(n.times(n));
4520      }
4521    }
4522
4523    external = true;
4524
4525    return t.sqrt();
4526  }
4527
4528
4529  /*
4530   * Return true if object is a Decimal instance (where Decimal is any Decimal constructor),
4531   * otherwise return false.
4532   *
4533   */
4534  function isDecimalInstance(obj) {
4535    return obj instanceof Decimal || obj && obj.toStringTag === tag || false;
4536  }
4537
4538
4539  /*
4540   * Return a new Decimal whose value is the natural logarithm of `x`, rounded to `precision`
4541   * significant digits using rounding mode `rounding`.
4542   *
4543   * x {number|string|Decimal}
4544   *
4545   */
4546  function ln(x) {
4547    return new this(x).ln();
4548  }
4549
4550
4551  /*
4552   * Return a new Decimal whose value is the log of `x` to the base `y`, or to base 10 if no base
4553   * is specified, rounded to `precision` significant digits using rounding mode `rounding`.
4554   *
4555   * log[y](x)
4556   *
4557   * x {number|string|Decimal} The argument of the logarithm.
4558   * y {number|string|Decimal} The base of the logarithm.
4559   *
4560   */
4561  function log(x, y) {
4562    return new this(x).log(y);
4563  }
4564
4565
4566  /*
4567   * Return a new Decimal whose value is the base 2 logarithm of `x`, rounded to `precision`
4568   * significant digits using rounding mode `rounding`.
4569   *
4570   * x {number|string|Decimal}
4571   *
4572   */
4573  function log2(x) {
4574    return new this(x).log(2);
4575  }
4576
4577
4578  /*
4579   * Return a new Decimal whose value is the base 10 logarithm of `x`, rounded to `precision`
4580   * significant digits using rounding mode `rounding`.
4581   *
4582   * x {number|string|Decimal}
4583   *
4584   */
4585  function log10(x) {
4586    return new this(x).log(10);
4587  }
4588
4589
4590  /*
4591   * Return a new Decimal whose value is the maximum of the arguments.
4592   *
4593   * arguments {number|string|Decimal}
4594   *
4595   */
4596  function max() {
4597    return maxOrMin(this, arguments, 'lt');
4598  }
4599
4600
4601  /*
4602   * Return a new Decimal whose value is the minimum of the arguments.
4603   *
4604   * arguments {number|string|Decimal}
4605   *
4606   */
4607  function min() {
4608    return maxOrMin(this, arguments, 'gt');
4609  }
4610
4611
4612  /*
4613   * Return a new Decimal whose value is `x` modulo `y`, rounded to `precision` significant digits
vendor: 3,473 bytes, lines 4614-4757
4614   * using rounding mode `rounding`.
4615   *
4616   * x {number|string|Decimal}
4617   * y {number|string|Decimal}
4618   *
4619   */
4620  function mod(x, y) {
4621    return new this(x).mod(y);
4622  }
4623
4624
4625  /*
4626   * Return a new Decimal whose value is `x` multiplied by `y`, rounded to `precision` significant
4627   * digits using rounding mode `rounding`.
4628   *
4629   * x {number|string|Decimal}
4630   * y {number|string|Decimal}
4631   *
4632   */
4633  function mul(x, y) {
4634    return new this(x).mul(y);
4635  }
4636
4637
4638  /*
4639   * Return a new Decimal whose value is `x` raised to the power `y`, rounded to precision
4640   * significant digits using rounding mode `rounding`.
4641   *
4642   * x {number|string|Decimal} The base.
4643   * y {number|string|Decimal} The exponent.
4644   *
4645   */
4646  function pow(x, y) {
4647    return new this(x).pow(y);
4648  }
4649
4650
4651  /*
4652   * Returns a new Decimal with a random value equal to or greater than 0 and less than 1, and with
4653   * `sd`, or `Decimal.precision` if `sd` is omitted, significant digits (or less if trailing zeros
4654   * are produced).
4655   *
4656   * [sd] {number} Significant digits. Integer, 0 to MAX_DIGITS inclusive.
4657   *
4658   */
4659  function random(sd) {
4660    var d, e, k, n,
4661      i = 0,
4662      r = new this(1),
4663      rd = [];
4664
4665    if (sd === void 0) sd = this.precision;
4666    else checkInt32(sd, 1, MAX_DIGITS);
4667
4668    k = Math.ceil(sd / LOG_BASE);
4669
4670    if (!this.crypto) {
4671      for (; i < k;) rd[i++] = Math.random() * 1e7 | 0;
4672
4673    // Browsers supporting crypto.getRandomValues.
4674    } else if (crypto.getRandomValues) {
4675      d = crypto.getRandomValues(new Uint32Array(k));
4676
4677      for (; i < k;) {
4678        n = d[i];
4679
4680        // 0 <= n < 4294967296
4681        // Probability n >= 4.29e9, is 4967296 / 4294967296 = 0.00116 (1 in 865).
4682        if (n >= 4.29e9) {
4683          d[i] = crypto.getRandomValues(new Uint32Array(1))[0];
4684        } else {
4685
4686          // 0 <= n <= 4289999999
4687          // 0 <= (n % 1e7) <= 9999999
4688          rd[i++] = n % 1e7;
4689        }
4690      }
4691
4692    // Node.js supporting crypto.randomBytes.
4693    } else if (crypto.randomBytes) {
4694
4695      // buffer
4696      d = crypto.randomBytes(k *= 4);
4697
4698      for (; i < k;) {
4699
4700        // 0 <= n < 2147483648
4701        n = d[i] + (d[i + 1] << 8) + (d[i + 2] << 16) + ((d[i + 3] & 0x7f) << 24);
4702
4703        // Probability n >= 2.14e9, is 7483648 / 2147483648 = 0.0035 (1 in 286).
4704        if (n >= 2.14e9) {
4705          crypto.randomBytes(4).copy(d, i);
4706        } else {
4707
4708          // 0 <= n <= 2139999999
4709          // 0 <= (n % 1e7) <= 9999999
4710          rd.push(n % 1e7);
4711          i += 4;
4712        }
4713      }
4714
4715      i = k / 4;
4716    } else {
4717      throw Error(cryptoUnavailable);
4718    }
4719
4720    k = rd[--i];
4721    sd %= LOG_BASE;
4722
4723    // Convert trailing digits to zeros according to sd.
4724    if (k && sd) {
4725      n = mathpow(10, LOG_BASE - sd);
4726      rd[i] = (k / n | 0) * n;
4727    }
4728
4729    // Remove trailing words which are zero.
4730    for (; rd[i] === 0; i--) rd.pop();
4731
4732    // Zero?
4733    if (i < 0) {
4734      e = 0;
4735      rd = [0];
4736    } else {
4737      e = -1;
4738
4739      // Remove leading words which are zero and adjust exponent accordingly.
4740      for (; rd[0] === 0; e -= LOG_BASE) rd.shift();
4741
4742      // Count the digits of the first word of rd to determine leading zeros.
4743      for (k = 1, n = rd[0]; n >= 10; n /= 10) k++;
4744
4745      // Adjust the exponent for leading zeros of the first word of rd.
4746      if (k < LOG_BASE) e -= LOG_BASE - k;
4747    }
4748
4749    r.e = e;
4750    r.d = rd;
4751
4752    return r;
4753  }
4754
4755
4756  /*
4757   * Return a new Decimal whose value is `x` rounded to an integer using rounding mode `roun
4757ding`.
4758   *
4759   * To emulate `Math.round`, set rounding to 7 (ROUND_HALF_CEIL).
4760   *
4761   * x {number|string|Decimal}
4762   *
4763   */
4764  function round(x) {
4765    return finalise(x = new this(x), x.e + 1, this.rounding);
4766  }
4767
4768
4769  /*
4770   * Return
4771   *   1    if x > 0,
4772   *  -1    if x < 0,
4773   *   0    if x is 0,
4774   *  -0    if x is -0,
4775   *   NaN  otherwise
4776   *
4777   * x {number|string|Decimal}
4778   *
4779   */
4780  function sign(x) {
4781    x = new this(x);
4782    return x.d ? (x.d[0] ? x.s : 0 * x.s) : x.s || NaN;
4783  }
4784
4785
4786  /*
4787   * Return a new Decimal whose value is the sine of `x`, rounded to `precision` significant digits
4788   * using rounding mode `rounding`.
4789   *
4790   * x {number|string|Decimal} A value in radians.
4791   *
4792   */
4793  function sin(x) {
4794    return new this(x).sin();
4795  }
4796
4797
4798  /*
4799   * Return a new Decimal whose value is the hyperbolic sine of `x`, rounded to `precision`
4800   * significant digits using rounding mode `rounding`.
4801   *
4802   * x {number|string|Decimal} A value in radians.
4803   *
4804   */
4805  function sinh(x) {
4806    return new this(x).sinh();
4807  }
4808
4809
4810  /*
4811   * Return a new Decimal whose value is the square root of `x`, rounded to `precision` significant
4812   * digits using rounding mode `rounding`.
4813   *
4814   * x {number|string|Decimal}
4815   *
4816   */
4817  function sqrt(x) {
4818    return new this(x).sqrt();
4819  }
4820
4821
4822  /*
4823   * Return a new Decimal whose value is `x` minus `y`, rounded to `precision` significant digits
4824   * using rounding mode `rounding`.
4825   *
4826   * x {number|string|Decimal}
4827   * y {number|string|Decimal}
4828   *
4829   */
4830  function sub(x, y) {
4831    return new this(x).sub(y);
4832  }
4833
4834
4835  /*
4836   * Return a new Decimal whose value is the sum of the arguments, rounded to `precision`
4837   * significant digits using rounding mode `rounding`.
4838   *
4839   * Only the result is rounded, not the intermediate calculations.
4840   *
4841   * arguments {number|string|Decimal}
4842   *
4843   */
4844  function sum() {
4845    var i = 0,
4846      args = arguments,
4847      x = new this(args[i]);
4848
4849    external = false;
4850    for (; x.s && ++i < args.length;) x = x.plus(args[i]);
4851    external = true;
4852
4853    return finalise(x, this.precision, this.rounding);
4854  }
4855
4856
4857  /*
4858   * Return a new Decimal whose value is the tangent of `x`, rounded to `precision` significant
vendor: 1,766 bytes, lines 4859-4934
4859   * digits using rounding mode `rounding`.
4860   *
4861   * x {number|string|Decimal} A value in radians.
4862   *
4863   */
4864  function tan(x) {
4865    return new this(x).tan();
4866  }
4867
4868
4869  /*
4870   * Return a new Decimal whose value is the hyperbolic tangent of `x`, rounded to `precision`
4871   * significant digits using rounding mode `rounding`.
4872   *
4873   * x {number|string|Decimal} A value in radians.
4874   *
4875   */
4876  function tanh(x) {
4877    return new this(x).tanh();
4878  }
4879
4880
4881  /*
4882   * Return a new Decimal whose value is `x` truncated to an integer.
4883   *
4884   * x {number|string|Decimal}
4885   *
4886   */
4887  function trunc(x) {
4888    return finalise(x = new this(x), x.e + 1, 1);
4889  }
4890
4891
4892  // Create and configure initial Decimal constructor.
4893  Decimal = clone(DEFAULTS);
4894  Decimal.prototype.constructor = Decimal;
4895  Decimal['default'] = Decimal.Decimal = Decimal;
4896
4897  // Create the internal constants from their string values.
4898  LN10 = new Decimal(LN10);
4899  PI = new Decimal(PI);
4900
4901
4902  // Export.
4903
4904
4905  // AMD.
4906  if (typeof define == 'function' && define.amd) {
4907    define(function () {
4908      return Decimal;
4909    });
4910
4911  // Node and other environments that support module.exports.
4912  } else if (typeof module != 'undefined' && module.exports) {
4913    if (typeof Symbol == 'function' && typeof Symbol.iterator == 'symbol') {
4914      P[Symbol['for']('nodejs.util.inspect.custom')] = P.toString;
4915      P[Symbol.toStringTag] = 'Decimal';
4916    }
4917
4918    module.exports = Decimal;
4919
4920  // Browser.
4921  } else {
4922    if (!globalScope) {
4923      globalScope = typeof self != 'undefined' && self && self.self == self ? self : window;
4924    }
4925
4926    noConflict = globalScope.Decimal;
4927    Decimal.noConflict = function () {
4928      globalScope.Decimal = noConflict;
4929      return Decimal;
4930    };
4931
4932    globalScope.Decimal = Decimal;
4933  }
4934})(this);

Line numbers count LF bytes from the start of the resource, as the search results do. Vendor segments are library code the classifier recognised; they are stored but not indexed. Bytes are shown as Latin1 characters, one per byte.