1: Khronos имеет текущую спецификацию для интерфейса DataView
как часть требований WebGL TypedArray
, которые в сочетании с Int32Array
и Float64Array
позволят вам записать ваши два целых числа в буфер и считать их обратно как двойные.
К сожалению, поддержка браузера для этого не существуетПока что не часто - чтобы проверить ваш браузер, посетите http://html5test.com/ и посмотрите раздел, озаглавленный «Собственные двоичные данные».
Без поддержки TypedArray
выше я неЯ думаю, что есть какой-то способ сделать это с помощью бит-тиддлинга, так как битовые операторы Javascript обрабатывают числа как 32-битные беззнаковые значения, поэтому у вас не будет доступа к битам старшего разряда.У меня нет никакой конкретной формы, IEE754 - это просто внутреннее представление.
3: это точка, в которой вы можете попытаться показать фактическую точность.К сожалению, встроенный метод, например Number.toFixed()
, не поддерживает отображение более 20 знаков после запятой.Вам нужно будет проанализировать экспоненциальную форму и вручную построить строку с соответствующим количеством ведущих нулей.
NB - диапазон экспонент двойного числа равен 2 ^ 1024, а не 10 ^ 1024, поэтому реальный предел равенна самом деле ~ 1,0E ± 308 - ваш примерный показатель меньше этого диапазона.
EDIT на самом деле, может быть способ, но я не могу гарантировать точность этого:
- возьмите два целых числа, назовите их
hi
и lo
. - извлеките показатель степени -
exp = (hi >> 20) & 0x7ff
- извлеките знак -
sign = (hi >> 31)
- Извлечь мантиссу -
((hi & 0xfffff) * Math.pow(2, 32) + lo) / Math.pow(2, 52)
result = (1 + m) * (Math.pow(2.0, exp - 1023))
if (sign) result *= -1
РЕДАКТИРОВАТЬ 2 - это работает!См. http://jsfiddle.net/alnitak/assXS/
var hex2double = function(input) {
var hi = parseInt(input.substring(0, 8), 16);
var lo = parseInt(input.substring(8 ), 16);
var p32 = 0x100000000;
var p52 = 0x10000000000000;
var exp = (hi >> 20) & 0x7ff;
var sign = (hi >> 31);
var m = 1 + ((hi & 0xfffff) * p32 + lo) / p52;
m = exp ? (m + 1) : (m * 2.0);
return (sign ? -1 : 1) * m * Math.pow(2, exp - 1023);
};
Введите число с плавающей запятой в http://babbage.cs.qc.edu/IEEE-754/Decimal.html,, возьмите полученную шестнадцатеричную строку из нижнего ряда выходных данных и передайте ее функции выше.Вы должны увидеть предупреждение, содержащее исходное значение.
EDIT 3 код исправлен для учета особого случая, когда все биты экспоненты равны нулю.