UNPKG

decimal128

Version:

Partial implementation of IEEE 754 Decimal128 decimal floating-point numbers

56 lines (55 loc) 2 kB
import { Decimal128 } from "../src/Decimal128.mjs"; function getRandomInt(max) { return Math.floor(Math.random() * max); } function getRandomDigits(n) { let digits = []; for (let i = 0; i < n; i++) { digits.push(getRandomInt(10)); } return digits; } function getRandomDigitsAsString(n) { let digits = getRandomDigits(n + 4); return digits.slice(0, n).join("") + "." + digits.slice(n).join(""); } function compareNumbers(digits1, digits2, digits3, digits4, digits5) { let d1 = new Decimal128(digits1); let d2 = new Decimal128(digits2); let d3 = new Decimal128(digits3); let d4 = new Decimal128(digits4); let d5 = new Decimal128(digits5); let decimalResult = d1.add(d2).add(d3).add(d4).multiply(d5); let numberResult = (Number(digits1) + Number(digits2) + Number(digits3) + Number(digits4)) * Number(digits5); let numberResultString = numberResult.toFixed(4); let decimalResultString = decimalResult.toFixed({ digits: 4 }); return [numberResultString, decimalResultString]; } function keepTrying() { let digits1 = getRandomDigitsAsString(3); let digits2 = getRandomDigitsAsString(3); let digits3 = getRandomDigitsAsString(4); let digits4 = getRandomDigitsAsString(4); let digits5 = getRandomDigitsAsString(4); let [result1, result2] = compareNumbers(digits1, digits2, digits3, digits4, digits5); if (result1 !== result2) { let diff = new Decimal128(result1) .subtract(new Decimal128(result2)) .abs(); console.log(`(${digits1} + ${digits2} + ${digits3} + ${digits4}) * ${digits5} = ${result1} but it should be ${result2} (difference: ${diff.toString()})`); } return result1 !== result2; } let numAttempts = 1000; let numFailures = 0; for (let i = 0; i < numAttempts; i++) { let failed = keepTrying(); if (failed) { numFailures++; } } console.log(`Failed ${numFailures} out of ${numAttempts} attempts`);