2017-04-08 57 views
0

我正在努力提高我对Node中浮点数的理解。我的理解是,每个在JavaScript中的数字存储为64位浮点(这是一种疯狂,非常酷),我想玩这些一点点。有没有办法看到节点js如何在内部存储数字?

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

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

我知道我可以写一个这样做的函数,但我有兴趣从另一面看事物!

谢谢!

+0

对于整数'num.toString(2)'应该工作。虽然不知道小数点左右。 – Sirko

+1

首先,你错误地认为每个数字都存储为浮点数。它们也可以作为整数存储。 –

+0

ECMAScript规范没有区分“浮点数”和“整数”,是的,但这并不意味着所有数字都被JavaScript引擎存储为浮点数。出于性能原因,即使差异从外部不可见,许多引擎也会在内部支持优化的整数类型。 – gyre

回答

1

我的理解是,在JavaScript中每个数字存储为一个64位浮点

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

诀窍是64位机器上的指针是这样对齐的,使得至少三个有效位为0.所以你可以在指针本身存储附加信息(例如它是指针还是整数) 。

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

另一方面,WebKit实现现在使用所谓的南拳,它将指针存储在双打内。这从观察NaN有不同表示的观点来看。您可能会问,如何在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中看到的是两个不同的世界。

+0

谢谢,很好的回答!我的意思是“写一个这样做的函数”是写一个函数,它可以接收一个数字并返回所述数字的64位浮点数表示。这非常有趣,我很感激! –

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);

+0

谢谢!一些非常酷的函数调用在这里,我很欣赏它。 –

相关问题