我正在努力提高我對Node中浮點數的理解。我的理解是,每個在JavaScript中的數字存儲爲64位浮點(這是一種瘋狂,非常酷),我想玩這些一點點。有沒有辦法看到節點js如何在內部存儲數字?
是否有一種簡單的方法可以打印出內部如何存儲任意數字?像(5).toFloatRepresentation()這將返回101...
?
我環顧四周,找不到任何東西 - 如果我錯過了一些明顯的東西,我很抱歉!
我知道我可以寫一個這樣做的函數,但我有興趣從另一面看事物!
謝謝!
我正在努力提高我對Node中浮點數的理解。我的理解是,每個在JavaScript中的數字存儲爲64位浮點(這是一種瘋狂,非常酷),我想玩這些一點點。有沒有辦法看到節點js如何在內部存儲數字?
是否有一種簡單的方法可以打印出內部如何存儲任意數字?像(5).toFloatRepresentation()這將返回101...
?
我環顧四周,找不到任何東西 - 如果我錯過了一些明顯的東西,我很抱歉!
我知道我可以寫一個這樣做的函數,但我有興趣從另一面看事物!
謝謝!
我的理解是,在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中看到的是兩個不同的世界。
謝謝,很好的回答!我的意思是「寫一個這樣做的函數」是寫一個函數,它可以接收一個數字並返回所述數字的64位浮點數表示。這非常有趣,我很感激! –
這裏是你如何能得到一個浮點數的可視化:
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);
謝謝!一些非常酷的函數調用在這裏,我很欣賞它。 –
對於整數'num.toString(2)'應該工作。雖然不知道小數點左右。 – Sirko
首先,你錯誤地認爲每個數字都存儲爲浮點數。它們也可以作爲整數存儲。 –
ECMAScript規範沒有區分「浮點數」和「整數」,是的,但這並不意味着所有數字都被JavaScript引擎存儲爲浮點數。出於性能原因,即使差異從外部不可見,許多引擎也會在內部支持優化的整數類型。 – gyre