Есть ли достаточно быстрый способ извлечь экспоненту и мантиссу из числа в 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};
}