JSFiddle - React, Tailwind, and code Playground
HTML
<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>
[0, 1, 1e100, 1e-100, Math.pow(2, 1023), Math.pow(2, -1023), 5e-324,
NaN, Infinity, -Infinity].forEach(function(value) {
var mantExp = frexp(value),
reconstructed = ldexp(mantExp[0], mantExp[1]);
document.write("<tr><td>" + value +
"</td><td>" + mantExp[0] + "</td><td>" + mantExp[1] +
"</td><td>" + reconstructed + "</td></tr>");
});
</script>
</table>
CSS
th, td {
border: 1px solid;
}
td {
text-align: right;
}
JavaScript
/*
* frexp() and ldexp() for JavaScript
* Handles regular floats and denorms
* Author: Bert Freudenberg <[email protected]>
*/
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,
mantissa = ldexp(value, -exponent);
return [mantissa, exponent];
}
function ldexp(mantissa, exponent) {
return exponent <= 1023 ?
mantissa * Math.pow(2, exponent) :
mantissa * Math.pow(2, 1023) * Math.pow(2, exponent - 1023);
}