decimal128
Version:
Partial implementation of IEEE 754 Decimal128 decimal floating-point numbers
1 lines • 20.4 kB
Source Map (JSON)
{"version":3,"file":"Rational.cjs","sources":["../../src/Rational.mts"],"sourcesContent":["import { countFractionalDigits, ROUNDING_MODE_CEILING, ROUNDING_MODE_FLOOR, ROUNDING_MODE_HALF_EVEN, ROUNDING_MODE_TRUNCATE, } from \"./common.mjs\";\nconst zero = BigInt(0);\nconst one = BigInt(1);\nconst minusOne = BigInt(-1);\nconst ten = BigInt(10);\nfunction gcd(a, b) {\n while (b !== zero) {\n let t = b;\n b = a % b;\n a = t;\n }\n return a;\n}\nfunction* nextDigitForDivision(x, y, n) {\n let result = \"\";\n let emittedDecimalPoint = false;\n let done = false;\n while (!done && countFractionalDigits(result) < n) {\n if (x === zero) {\n done = true;\n }\n else if (x < y) {\n if (emittedDecimalPoint) {\n x = x * ten;\n if (x < y) {\n // look ahead: are we still a power of 10 behind?\n result = result + \"0\";\n yield 0;\n }\n }\n else {\n emittedDecimalPoint = true;\n result = (result === \"\" ? \"0\" : result) + \".\";\n x = x * ten;\n yield -1;\n if (x < y) {\n // look ahead: are we still a power of 10 behind?\n result = result + \"0\";\n yield 0;\n }\n }\n }\n else {\n let q = x / y;\n x = x % y;\n let qString = q.toString();\n result = result + qString;\n for (let i = 0; i < qString.length; i++) {\n yield parseInt(qString.charAt(i));\n }\n }\n }\n return 0;\n}\nexport class Rational {\n constructor(p, q) {\n if (q === zero) {\n throw new RangeError(\"Cannot construct rational whose denominator is zero\");\n }\n let num = p;\n let den = q;\n let neg = false;\n if (p < zero) {\n if (q < zero) {\n num = -p;\n den = -q;\n }\n else {\n num = -p;\n neg = true;\n }\n }\n else if (q < zero) {\n den = -q;\n neg = true;\n }\n let g = gcd(num, den);\n this.numerator = num / g;\n this.denominator = den / g;\n this.isNegative = neg;\n }\n toString() {\n return `${this.isNegative ? \"-\" : \"\"}${this.numerator}/${this.denominator}`;\n }\n static fromString(s) {\n if (s.match(/^-/)) {\n return Rational.fromString(s.substring(1)).negate();\n }\n if (s.match(/^[0-9]+$/)) {\n return new Rational(BigInt(s), 1n);\n }\n if (s.match(/^[0-9]+[eE][+-]?[0-9]+$/)) {\n let [num, exp] = s.split(/[eE]/);\n let originalRat = new Rational(BigInt(num), 1n);\n return originalRat.scale10(Number(exp));\n }\n if (s.match(/[.]/)) {\n let [whole, decimal] = s.split(\".\");\n if (decimal.match(/[eE]/)) {\n let [dec, exp] = decimal.split(/[eE]/);\n let originalRat = Rational.fromString(`${whole}.${dec}`);\n return originalRat.scale10(Number(exp));\n }\n let numerator = BigInt(whole + decimal);\n let denominator = ten ** BigInt(decimal.length);\n return new Rational(numerator, denominator);\n }\n throw new SyntaxError(`Invalid rational number string: ${s}`);\n }\n scale10(n) {\n if (this.isNegative) {\n return this.negate().scale10(n).negate();\n }\n if (n === 0) {\n return this;\n }\n if (n < 0) {\n return new Rational(this.numerator, this.denominator * ten ** BigInt(0 - n));\n }\n return new Rational(this.numerator * ten ** BigInt(n), this.denominator);\n }\n negate() {\n if (this.isNegative) {\n return new Rational(this.numerator, this.denominator);\n }\n return new Rational(this.numerator * minusOne, this.denominator);\n }\n static _add(x, y) {\n if (x.isNegative) {\n return Rational._subtract(y, x.negate());\n }\n if (y.isNegative) {\n return Rational._subtract(x, y.negate());\n }\n return new Rational(x.numerator * y.denominator + y.numerator * x.denominator, x.denominator * y.denominator);\n }\n static _subtract(x, y) {\n if (x.isNegative) {\n return Rational._add(x.negate(), y).negate();\n }\n return new Rational(x.numerator * y.denominator - y.numerator * x.denominator, x.denominator * y.denominator);\n }\n static _multiply(x, y) {\n return new Rational(x.numerator * y.numerator, x.denominator * y.denominator);\n }\n static add(...theArgs) {\n return theArgs.reduce((acc, cur) => Rational._add(acc, cur), new Rational(zero, one));\n }\n static subtract(x, ...theArgs) {\n return theArgs.reduce((acc, cur) => Rational._subtract(acc, cur), x);\n }\n static multiply(...theArgs) {\n return theArgs.reduce((acc, cur) => Rational._multiply(acc, cur), new Rational(one, one));\n }\n toFixed(n) {\n if (n !== Infinity && !Number.isInteger(n)) {\n throw new TypeError(\"Cannot enumerate a non-integer number of decimal places\");\n }\n if (n < 0) {\n throw new RangeError(\"Cannot enumerate a negative number of decimal places\");\n }\n if (this.isNegative) {\n return \"-\" + this.negate().toFixed(n);\n }\n if (this.numerator === zero) {\n if (Infinity === n) {\n throw new RangeError(\"Cannot enumerate infinite decimal places of zero\");\n }\n return \"0\" + \".\" + \"0\".repeat(n);\n }\n let digitGenerator = nextDigitForDivision(this.numerator, this.denominator, n);\n let digit = digitGenerator.next();\n let result = \"\";\n while (!digit.done) {\n let v = digit.value;\n if (-1 === v) {\n result = (\"\" === result ? \"0\" : result) + \".\";\n }\n else {\n result = result + `${v}`;\n }\n digit = digitGenerator.next();\n }\n if (Infinity === n) {\n return result;\n }\n let numFractionalDigits = countFractionalDigits(result);\n if (numFractionalDigits >= n) {\n return result;\n }\n let numZeroesNeeded = n - numFractionalDigits;\n let zeroesNeeded = \"0\".repeat(numZeroesNeeded);\n if (result.match(/[.]/)) {\n return result + zeroesNeeded;\n }\n return result + \".\" + zeroesNeeded;\n }\n static roundHalfEven(initialPart, penultimateDigit, finalDigit, quantum) {\n if (finalDigit < 5) {\n return initialPart;\n }\n if (finalDigit > 5) {\n return Rational.add(initialPart, initialPart.isNegative ? quantum.negate() : quantum);\n }\n if (penultimateDigit % 2 === 0) {\n return initialPart;\n }\n return Rational.add(initialPart, initialPart.isNegative ? quantum.negate() : quantum);\n }\n static roundHalfExpand(initialPart, penultimateDigit, finalDigit, quantum) {\n if (finalDigit < 5) {\n return initialPart;\n }\n return Rational.add(initialPart, initialPart.isNegative ? quantum.negate() : quantum);\n }\n static roundCeil(initialPart, penultimateDigit, finalDigit, quantum) {\n if (initialPart.isNegative) {\n return initialPart;\n }\n if (finalDigit === 0) {\n return initialPart;\n }\n return Rational.add(initialPart, quantum);\n }\n static roundFloor(initialPart, penultimateDigit, finalDigit, quantum) {\n if (initialPart.isNegative) {\n return Rational.subtract(initialPart, quantum);\n }\n return initialPart;\n }\n round(numFractionalDigits, mode) {\n if (numFractionalDigits < 0) {\n throw new RangeError(\"Cannot round to negative number of decimal places\");\n }\n let s = this.toFixed(numFractionalDigits + 1);\n let [integerPart, fractionalPart] = s.split(\".\");\n let quantum = Rational.fromString(numFractionalDigits === 0\n ? \"1\"\n : \"0\" + \".\" + \"0\".repeat(numFractionalDigits - 1) + \"1\");\n let truncated = Rational.fromString(integerPart + \".\" + fractionalPart.substring(0, numFractionalDigits));\n let penultimateDigit = parseInt(numFractionalDigits === 0\n ? integerPart.charAt(integerPart.length - 1)\n : fractionalPart.charAt(numFractionalDigits - 1));\n let finalDigit = parseInt(fractionalPart.charAt(numFractionalDigits));\n if (mode === ROUNDING_MODE_TRUNCATE) {\n return truncated;\n }\n if (mode === ROUNDING_MODE_HALF_EVEN) {\n return Rational.roundHalfEven(truncated, penultimateDigit, finalDigit, quantum);\n }\n if (mode === ROUNDING_MODE_CEILING) {\n return Rational.roundCeil(truncated, penultimateDigit, finalDigit, quantum);\n }\n if (mode === ROUNDING_MODE_FLOOR) {\n return Rational.roundFloor(truncated, penultimateDigit, finalDigit, quantum);\n }\n return Rational.roundHalfExpand(truncated, penultimateDigit, finalDigit, quantum);\n }\n cmp(x) {\n let a = (this.isNegative ? minusOne : one) * this.numerator * x.denominator;\n let b = (x.isNegative ? minusOne : one) * x.numerator * this.denominator;\n if (a < b) {\n return -1;\n }\n if (b < a) {\n return 1;\n }\n return 0;\n }\n isZero() {\n return this.numerator === zero;\n }\n}\n"],"names":["countFractionalDigits","ROUNDING_MODE_TRUNCATE","ROUNDING_MODE_HALF_EVEN","ROUNDING_MODE_CEILING","ROUNDING_MODE_FLOOR"],"mappings":"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"}