
import { eSign } from "./e-sign.js";
import { msbExponent } from "../double-representation/msb-exponent.js";
import { eCompress } from "./e-compress.js";
import { reduceSignificand } from "../basic/reduce-significand.js";


// We *have* to do the below❗ The assignee is a getter❗ The assigned is a pure function❗
const sign = eSign;
const compress = eCompress;


/**
 * Returns a floating point expansion accurate to the given number of bits. 
 * Extraneous bits are discarded.
 * @param a a floating point expansion
 * @param l the number of accurate bits to keep
 */
// TODO - make faster
function eToBitlength(
        a: number[], 
        l: number) {

    a = compress(a);
    if (sign(a) === 0) { return [0]; }

    const maxMsb = msbExponent(a[a.length-1]);
    let msb = maxMsb;
    let i=a.length-1; // start at most significant byte
    while (i > 0) {
        const msb_ = msbExponent(a[i-1]);
        if (maxMsb-msb_ > l) {
            break;
        }
        msb = msb_;
        i--;
    }

    const keepBits = Math.min(l - (maxMsb - msb), 53);
    let b = a[i];
    b = reduceSignificand(b, keepBits);

    const result = a.slice(i);
    result[0] = b;

    return result;
}


export { eToBitlength }

