有没有办法看看节点js如何在内部存储数字?

时间:2017-04-08 07:44:57

标签: javascript node.js floating-point

我正致力于提高对Node中浮点的理解。我的理解是, javascript中的每个数字都存储为64位浮点数(这有点疯狂,非常酷)我想玩这些一点点。

是否有一种简单的方法可以打印出内部存储任意数字的方式?像(5).toFloatRepresentation()那样会返回101...

我环顾四周,无法找到任何东西 - 如果我错过了一些明显的东西,我道歉!

我知道我可以写一个能做到这一点的功能,但我有兴趣从另一方面看待事情!

谢谢!

2 个答案:

答案 0 :(得分:1)

以下是如何获取浮点数的可视化:



function getBinaryRepresentation(num) {
    // Store as float
    var buffer = new Float64Array([num]).buffer;
    // Retrieve as unsigned bytes
    var view   = new Uint8Array(buffer);
    // Convert bytes to string (binary representation)
    return view.reduceRight( 
        (arr, n) => arr.concat(('0000000' + n.toString(2)).substr(-8)), []
    ).join('');
}

function formatFloatBits(num) {
    var bits = getBinaryRepresentation(num);
    // Put spaces between the different parts: 
    // - sign (1 bit)
    // - exponent, with bias (11 bits)
    // - significand (52 bits), without most significant 1
    return bits[0] + ' ' + bits.slice(1, 12) + ' ' + bits.slice(12);
}

function print(num) {
    console.log(formatFloatBits(num));
}

// Examples:
print(0);
print(2);
print(2.1);
print(7);
print(-7);




答案 1 :(得分:1)

  

我的理解是javascript中的每个数字都存储为64位浮点

排序,种类,不完全。数字的内部表示非常复杂。最初V8(构建的JavaScript引擎节点js)在内部使用了标记指针。

技巧是64位机器上的指针以至少三个有效位为0的方式对齐。因此,您可以在指针本身中存储其他信息(例如,它是指针还是整数)。

因此,V8在同一个64位空间中存储堆栈中的整数和指针。注意,由于最后一位用作标志,因此V8中的整数最多为61位(而AFAIK只有32位?)。另一方面,双打作为单独的对象存储在堆上。

另一方面,WebKit实现现在使用所谓的nan-boxing,它将指针存储在双精度内。这是因为观察到NaN具有0个不同的表示。您可能会问如何在53位内存储64位指针(或实际的61位指针)?嗯,你可以,因为目前(即因为小的公羊尺寸)只使用48位。

因此在WebKit中,整数确实存储为双精度数。但是WebKit也有小整数存储在堆栈中(作为正确的整数类型),以便在循环和索引中使用它们。这是因为整数运算仍然至少与浮点运算一样快,在很多情况下更快。

这是一篇你可能想要阅读的有趣(虽然过时)文章:

https://wingolog.org/archives/2011/05/18/value-representation-in-javascript-implementations

  

是否有一种简单的方法可以打印出内部存储任意数字的方式?

没有。实际上根本就没有办法。正如我所提到的,完全取决于JavaScript引擎,并且规范中没有API来检索该信息。您可以尝试阅读the source code

  

我知道我可以编写一个执行此操作的函数

你做不到。反正不是在JavaScript中。除非我真的误解了这个问题。内部表示和您在JavaScript中看到的是两个不同的世界。