Извлечение экспоненты и мантиссы числа Javascript

Есть ли достаточно быстрый способ извлечь экспоненту и мантиссу из числа в Javascript?

AFAIK в Javascript нет способа разобраться в битах, стоящих за Number, из-за чего мне кажется, что я рассматриваю проблему факторизации: нахождение m и n таких, что 2 ^ n * m = k для данного k . Поскольку целочисленная факторизация находится в NP, я могу только предположить, что это будет довольно сложной проблемой.

Я реализую подключаемый модуль GHC для генерации Javascript, и мне нужно реализовать примитивные операции decodeFloat_Int # и decodeDouble_2Int # ; Думаю, я мог бы просто переписать те части базовой библиотеки, которые используют эту операцию, чтобы делать то, что они делают, каким-либо другим способом (что не должно быть слишком сложно, поскольку все числовые типы в любом случае имеют Number в качестве своего представления), но это ' Было бы хорошо, если бы мне не пришлось.

Есть ли какой-нибудь способ сделать это даже удаленно, с помощью какого-нибудь темного вуду Javascript, умной математики или каким-то другим способом, или я должен просто пристегнуться и взять базовую библиотеку?

РЕДАКТИРОВАТЬ Основываясь на превосходных ответах Руаха и Луи Вассермана, я придумал следующую реализацию, которая, кажется, работает достаточно хорошо:

function getNumberParts(x) {
    if(isNaN(x)) {
        return {mantissa: -6755399441055744, exponent: 972};
    }
    var sig = x > 0 ? 1 : -1;
    if(!isFinite(x)) {
        return {mantissa: sig * 4503599627370496, exponent: 972};
    }
    x = Math.abs(x);
    var exp = Math.floor(Math.log(x)*Math.LOG2E)-52;
    var man = x/Math.pow(2, exp);
    return {mantissa: sig*man, exponent: exp};
}

16
задан valderman 21 February 2012 в 20:39
поделиться