【问题标题】:Is there any way to see a number in it's 64 bit float IEEE754 representation有没有办法在它的 64 位浮点 IEEE754 表示中看到一个数字
【发布时间】: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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

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

    【讨论】:

      【解决方案3】:

      您可以使用类型化数组来检查数字的原始字节。用一个元素创建一个Float64Array,然后用相同的缓冲区创建一个Uint8Array。然后,您可以将浮点数组的第一个元素设置为您的数字,并通过Uint8Array 检查字节。当然,您必须对数字的各个部分进行一些转换和组合,但这并不难。

      没有内置工具可以执行提取指数等操作。

      【讨论】:

      • 谢谢,我尝试了下面的var f = new Float64Array(1); f[0] = -12; new Uint8Array(f.buffer).join(),它返回了这个0,0,0,0,0,0,40,192 - 我只期待零和一,但里面有40192。我做错了什么?
      • Uint8Array 将包含 8 个 8 位值。如果您想将它们视为二进制,则可以在每个字节上使用 .toString(2) - 此外,您必须以相反的顺序遍历数组,如您所见 - “有趣的”字节位于末尾。 192 是符号位和指数,然后40 是尾数的最重要部分。
      • 我明白了,谢谢。我会试试的。 您必须以相反的顺序遍历数组, - 是因为 Little Endian Byte Order 吗?
      • 谢谢,现在下一个问题我可能会问如何从二进制 IEE 754 float 解析为 javascript float :)
      • 我已经根据您的建议here实现了该功能,请看看我是否一切正确?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2018-11-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-07
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多