有没有办法查看数字在64位浮点数IEEE754表示中的形式?

8
JavaScript将所有数字存储为双精度64位格式的IEEE 754值,根据规范

数字类型恰好有18437736874454810627(即2的64次方减去2的53次方加3)个值,表示IEEE标准指定的双精度64位格式IEEE 754数值,用于二进制浮点运算。

在JavaScript中是否有以这种形式查看数字的方法?


可能是JavaScript浮点数从/到位的重复问题。 - thorn0
3个回答

4
您可以使用类型化数组来查看数字的原始字节。创建一个只有一个元素的 Float64Array,然后使用相同的缓冲区创建一个 Uint8Array。您可以将浮点数组的第一个元素设置为您的数字,然后通过 Uint8Array 查看字节。当然,您需要进行一些移位和组合来获取数字的各个部分,但这并不难。
没有内置的功能来提取指数等信息。

谢谢,我尝试了以下代码 var f = new Float64Array(1); f[0] = -12; new Uint8Array(f.buffer).join() 它返回了 0,0,0,0,0,0,40,192 - 我本来期望只有 0 和 1,但其中有 40192。我做错了什么? - Max Koretskyi
1
Uint8Array将包含8个8位值。如果您想将它们视为二进制,则可以在每个字节上使用.toString(2)-此外,您还必须按相反的顺序遍历数组,因为您可以看到“有趣”的字节出现在末尾。那个“192”是符号位和指数,然后“40”是尾数的最高有效部分。 - Pointy
我明白了,谢谢。我会尝试的。你需要按相反的顺序遍历数组,是因为小端字节顺序吗? - Max Koretskyi
谢谢,现在下一个问题我可能会问如何从二进制IEE 754浮点数解析到JavaScript浮点数 :) - Max Koretskyi
我已经根据你的建议在这里实现了该函数(https://dev59.com/8pbfa4cB1Zd3GeqPzNTQ#37092416),请看一下是否我做得都正确? - Max Koretskyi

3

根据@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

0

您可以使用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>


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接