【发布时间】:2016-09-02 11:03:17
【问题描述】:
Javascript 根据spec 将所有数字存储为双精度 64 位格式 IEEE 754 值:
Number 类型正好有 18437736874454810627(即 264−253+3) 值,表示双精度 64 位格式 IEEE 754 二进制浮点的 IEEE 标准中指定的值 算术
有没有办法在Javascript中查看这个表格中的数字?
【问题讨论】:
标签: javascript binary ieee-754
Javascript 根据spec 将所有数字存储为双精度 64 位格式 IEEE 754 值:
Number 类型正好有 18437736874454810627(即 264−253+3) 值,表示双精度 64 位格式 IEEE 754 二进制浮点的 IEEE 标准中指定的值 算术
有没有办法在Javascript中查看这个表格中的数字?
【问题讨论】:
标签: javascript binary ieee-754
您可以使用Basenumber.js 将数字转换为其 IEEE754 表示:
let x = Base(326.9);
let y = Base(-326.9);
// specify double precision (64)
let a = x.toIEEE754(64);
let b = y.toIEEE754(64);
console.log(a);
console.log(b);
// You can join them in an unique string this way
console.log(Object.values(a).join(""));
console.log(Object.values(b).join(""));
<script src='https://cdn.jsdelivr.net/gh/AlexSp3/Basenumber.js@main/BaseNumber.min.js'></script>
【讨论】:
根据@Pointy 的建议,我实现了以下函数以获取 64 位浮点 IEEE754 表示中的数字:
function to64bitFloat(number) {
var f = new Float64Array(1);
f[0] = number;
var view = new Uint8Array(f.buffer);
var i, result = "";
for (i = view.length - 1; i >= 0; i--) {
var bits = view[i].toString(2);
if (bits.length < 8) {
bits = new Array(8 - bits.length).fill('0').join("") + bits;
}
result += bits;
}
return result;
}
console.log(to64bitFloat(12)); // 0100000000101000000000000000000000000000000000000000000000000000
console.log(to64bitFloat(-12)); // 1100000000101000000000000000000000000000000000000000000000000000
【讨论】:
您可以使用类型化数组来检查数字的原始字节。用一个元素创建一个Float64Array,然后用相同的缓冲区创建一个Uint8Array。然后,您可以将浮点数组的第一个元素设置为您的数字,并通过Uint8Array 检查字节。当然,您必须对数字的各个部分进行一些转换和组合,但这并不难。
没有内置工具可以执行提取指数等操作。
【讨论】:
var f = new Float64Array(1); f[0] = -12; new Uint8Array(f.buffer).join(),它返回了这个0,0,0,0,0,0,40,192 - 我只期待零和一,但里面有40 和192。我做错了什么?
Uint8Array 将包含 8 个 8 位值。如果您想将它们视为二进制,则可以在每个字节上使用 .toString(2) - 此外,您必须以相反的顺序遍历数组,如您所见 - “有趣的”字节位于末尾。 192 是符号位和指数,然后40 是尾数的最重要部分。
Little Endian Byte Order 吗?