不知道有什么好办法。它当然可以通过困难的方式完成,这是一个完全在 JavaScript 中的单精度示例:
js> a = 0x41973333
1100428083
js> (a & 0x7fffff | 0x800000) * 1.0 / Math.pow(2,23) * Math.pow(2, ((a>>23 & 0xff) - 127))
18.899999618530273
生产实现应该考虑到大多数字段都有神奇的值,通常通过为最大或最小的内容指定特殊解释来实现。因此,检测NaN
s 和无穷大。上面的例子应该检查否定。(a & 0x80000000)
更新:好的,我也有双份的。您不能直接扩展上述技术,因为内部 JS 表示是双精度的,因此根据它的定义,它最多可以处理长度为 52 的位串,并且它的移位根本不能超过 32。
好的,要加倍,您首先将低 8 位或 32 位作为字符串切掉;用单独的对象处理它们。然后:
js> a = 0x40725082
1081233538
js> (a & 0xfffff | 0x100000) * 1.0 / Math.pow(2, 52 - 32) * Math.pow(2, ((a >> 52 - 32 & 0x7ff) - 1023))
293.03173828125
js>
我保留了上面的示例,因为它来自 OP。更难的情况是低 32 位有值。这是 0x40725082deadbeef 的转换,一个全精度双精度:
js> a = 0x40725082
1081233538
js> b = 0xdeadbeef
3735928559
js> e = (a >> 52 - 32 & 0x7ff) - 1023
8
js> (a & 0xfffff | 0x100000) * 1.0 / Math.pow(2,52-32) * Math.pow(2, e) +
b * 1.0 / Math.pow(2, 52) * Math.pow(2, e)
293.0319506442019
js>
您可以排除一些明显的子表达式,但我将其保留为这种方式,以便您了解它与格式的关系。