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