JSFiddle - React, Tailwind, and code Playground
HTML
<pre id="output"></pre>
JavaScript
"use strict";
let log = "";
onload = function() {
let ba = 31415926535897932384626433832795028841971n;
let bb = 27182818284590452353602874713526624977572n;
let va = bi2dd(ba);
let vb = bi2dd(bb);
log += "----+----|----+----|----+----|----+----|\n";
log += "a:\n";
dump(ba, va);
log += "----+----|----+----|----+----|----+----|\n";
log += "b:\n";
dump(bb, vb);
let hx = "50bccf0ef45e68a9";
let hy = "4d2766ab348b092c";
let x = dparse(hx);
let y = dparse(hy);
log += "----+----|----+----|----+----|----+----|\n";
log += "a * b:\n";
log += `${ba*bb}\n`;
log += `${BigInt(x)+BigInt(y)}\n`;
log += `x: ${x}\n`;
log += `y: ${y}\n`;
log += `${hx}\n`;
log += `${hy}\n`;
output.textContent = log;
};
// BigInt to double-double
function bi2dd(a) {
let x = Number(a);
let y = Number(a - BigInt(x));
return { x, y };
}
// double dump
function ddump(a) {
let f = new Float64Array(1);
let u = new Uint16Array(f.buffer);
f[0] = a;
for (let i = 0; i < 4; i++) {
log += u[3 - i].toString(16).padStart(4, "0");
}
log += "\n";
}
function dump(bi, v) {
log += `${bi}\n`;
log += `${BigInt(v.x)+BigInt(v.y)}\n`;
log += `x: ${v.x}\n`;
log += `y: ${v.y}\n`;
ddump(v.x);
ddump(v.y);
}
// double parse
function dparse(str) {
let f = new Float64Array(1);
let u = new Uint32Array(f.buffer);
for (let i = 0; i < 2; i++) {
u[1 - i] = parseInt(str.substr(8 * i, 8), 16);
}
return f[0];
}