Извлечение показателя степени и мантиссы числа Javascript
Есть ли достаточно быстрый способ извлечь показатель степени и мантиссу из числа в Javascript?
AFAIK, нет никакого способа добраться до битов за числом в Javascript, что заставляет меня думать, что я смотрю на проблему факторизации: поиск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};
}