JSFiddle - React, Tailwind, and code Playground
HTML
<table id="table">
<tr>
<th rowspan="2">value</th>
<th colspan="2">frexp(value)</th>
<th rowspan="2">ldexp(mantissa, exponent)</th>
</tr>
<tr>
<th>mantissa</th>
<th>exponent</th>
</tr>
<script>
window.onload = function() {
function p(x) { return x !== 0 ? "" + x : 1 / x < 0 ? "-0" : "0" }
var fmin = 5e-324;
var fmax = 1.7976931348623157e308;
[0, -0, 0.5, 1, 2, 1e100, 1e-100, Math.pow(2, 1023), Math.pow(2, -1023), fmin, fmax,
NaN, Infinity, -Infinity,
[fmin, 1023+1074], [fmax, -1023-1075], [11*fmin, -3]].forEach(function(value) {
var mantExp = value.length ? value : frexp(value),
reconstructed = ldexp(mantExp[0], mantExp[1]);
table.innerHTML += "<tr><td>" + p(value) +
"</td><td>" + p(mantExp[0]) + "</td><td>" + p(mantExp[1]) +
"</td><td>" + p(reconstructed) + "</td></tr>";
});
}
</script>
</table>
CSS
th, td {
border: 1px solid;
}
td {
text-align: right;
background-color: #F00,
}
JavaScript
/*
* frexp() and ldexp() for JavaScript
* Handles regular floats and denorms
* Author: Bert Freudenberg <bert@freudenbergs.de>
*/
function frexp(value) {
if (value === 0) return [value, 0];
var data = new DataView(new ArrayBuffer(8));
data.setFloat64(0, value);
var bits = (data.getUint32(0) >>> 20) & 0x7FF;
if (bits === 0) {
data.setFloat64(0, value * Math.pow(2, 64));
bits = ((data.getUint32(0) >>> 20) & 0x7FF) - 64;
}
var exponent = bits - 1022;
var mantissa = ldexp(value, -exponent);
return [mantissa, exponent];
}
function ldexp(mantissa, exponent) {
var steps = Math.min(3, Math.ceil(Math.abs(exponent) / 1023));
var result = mantissa;
for (var i = 0; i < steps; i++)
result *= Math.pow(2, Math.floor((exponent + i) / steps));
return result;
}