Существует ли достаточно быстрый способ извлечения экспоненты и мантиссы из числа в Javascript?
AFAIK нет способа получить бит за номером в Javascript, что заставляет меня казаться, что я смотрю на проблему факторизации: найти m
и n
, чтобы 2^n * m = k
для данного k
. Поскольку целочисленная факторизация в NP, я могу только предположить, что это будет довольно трудной проблемой.
Я внедряю плагин GHC для генерации Javascript и должен выполнить примитивные операции decodeFloat_Int#
и decodeDouble_2Int#
; Я думаю, я мог бы просто переписать части базовой библиотеки, которая использует операцию, чтобы сделать wahtever, они делают другим способом (что не должно быть слишком сложным, поскольку все числовые типы имеют Number как их представление в любом случае), но это означает, d быть хорошо, если бы мне не пришлось.
Есть ли способ сделать это хотя бы удаленно, с помощью какого-то темного Javascript voodoo, умной математики или каких-то других средств, или я должен просто спрятать и иметь в базовой библиотеке?
ИЗМЕНИТЬ Основываясь на замечательных ответах Руаха и Луи Вассермана, я придумал следующую реализацию, которая, кажется, работает достаточно хорошо:
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};
}