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];
}