decimal.js (135913B)
1 ;(function (globalScope) { 2 'use strict'; 3 4 5 /* 6 * decimal.js v10.3.1 7 * An arbitrary-precision Decimal type for JavaScript. 8 * https://github.com/MikeMcl/decimal.js 9 * Copyright (c) 2021 Michael Mclaughlin <M8ch88l@gmail.com> 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. 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 > 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| > 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 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` 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 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; 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) 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` 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 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 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 `rounding`. 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 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);