2017-04-08 61 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

謝謝!一些非常酷的函數調用在這裏,我很欣賞它。 –

相關問題