1:Khronos 有一个规范正在进行中 for a DataView
作为 WebGL 一部分的界面TypedArray
要求,结合Int32Array
and Float64Array
可以让你将两个 int 写入缓冲区,然后将它们作为 double 读回。
不幸的是,浏览器对此的支持还不常见 - 测试您的浏览器访问http://html5test.com/并查看标题为“本机二进制数据”的部分。
如果没有TypedArray
上面的支持我认为没有任何方法可以使用位旋转来做到这一点,因为 Javascript 的位运算符将数字视为 32 位无符号值,因此您无法访问高阶位。
2: double
变量没有任何特定的形式,IEE754 只是一种内部表示。
3: that's您可以尝试显示实际精度的点。不幸的是内置方法,例如Number.toFixed()
,不支持显示超过20位小数。您将需要解析指数形式并手动构造一个具有适当数量的前导零的字符串。
注意 - 双精度数的指数范围是 2^1024,而不是 10^1024,因此真正的限制实际上是 ~1.0E±308 - 您的示例数字小于该范围。
EDIT实际上,可能有一种方法,但我不能保证其精度:
- 取两个整数,调用它们
hi
and 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
EDIT 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固定代码以考虑指数位全为零时的特殊情况。