2014-01-25 69 views
14

我在閱讀second chapter of the book Eloquent JavaScript。作者指出:JavaScript中的最大整數值

Any whole number less than 2^52 (which is more than 10^15) will safely fit in a JavaScript number.

我抓住的2^52的值從wikipedia

4,503,599,627,370,496

的值必須小於2^52,所以我從初始值中減去1;

var max = 4503599627370495; 

定義最大變量我檢查什麼的(我使用Chrome 32.0.1700.77)的值之後。

console.log(max); // 4503599627370495 

我想看到的時候我去了這個限制會發生什麼,所以我加入一個好幾次。

沒想到:

max += 1; 
console.log(max); // 4503599627370496 
max += 1; 
console.log(max); // 4503599627370497 
max += 1; 
console.log(max); // 4503599627370498 

我走到了極限,計算仍精確。

我試過2的下一個動力,而不是2^53,我沒有1。減去這個時候:

9,007,199,254,740,992

var max = 9007199254740992; 

這一次似乎是一個更大的限制,似乎我可以很安全地添加和減少數字:

max += 1; 
console.log(max); // 9007199254740992 
max += 1; 
console.log(max); // 9007199254740992 
max -= 1; 
console.log(max); // 9007199254740991 
max += 1; 
console.log(max); // 9007199254740992 
max -= 900; 
console.log(max); // 9007199254740092 
max += 900; 
console.log(max); // 9007199254740992 

我可以給最大值分配一個更大的值,但它會失去精度,我無法再安全地添加或減去數字。

您能否正確解釋引擎蓋下的機制?比例超過2^52之後,會發生什麼情況會很有幫助。

+0

我不認爲它是一個騙局,但僅供參考:http://stackoverflow.com/q/307179/1169798 – Sirko

回答

10

這不是一個強類型的編程語言。 JS有一個對象Number。你甚至可以獲得無限數量:document.write(Math.exp(1000));

document.write(Number.MIN_VALUE + "<br>"); 
document.write(Number.MAX_VALUE + "<br>"); 

document.write(Number.POSITIVE_INFINITY + "<br>"); 
document.write(Number.NEGATIVE_INFINITY + "<br>"); 

    alert([ 
     Number.MAX_VALUE/(1e293), 
     Number.MAX_VALUE/(1e292), 
     Number.MAX_VALUE/(1e291), 
     Number.MAX_VALUE/(1e290), 
    ].join('\n')) 

希望這是一個有用的答案。謝謝!

UPDATE: 最大int是 - +/- 9007199254740992

6

你可以找到關於JavaScript的號碼類型這裏的一些信息:ECMA-262 5th Edition: The Number Type

正如它所提到的,數字表示爲一個64位浮點數,尾數爲53位(有效數字),指數爲11位(IEEE 754)。結果是:尾數* 2 ^指數。

這意味着可以在尾數中表示最多2^53個值(其中一些數字具有特殊含義,其餘爲正整數和負整數)。

數字2^53(9007199254740992)不能在尾數中表示,您必須使用指數。例如,您可以將2^53表示爲(9007199254740992/2) * 2^1,即。 mantissa = 9007199254740992/2 = 4503599627370496exponent = 1

讓我們來看看2^53 + 1(9007199254740993)會發生什麼情況。在這裏,我們必須這樣做,mantissa = 9007199254740993/2 = 4503599627370496。哎呀,這和我們2^53的尾數不一樣嗎?看起來有一些舍入錯誤! (注意:上面的例子實際上並不是真正起作用的:尾數總是被解釋爲在第一個數字之後有一個點,這意味着例如數字3實際上被存儲爲1.5*2。這在上面的解釋中更易於理解)。

有關浮點數的更多信息(一般)在這裏:What Every Computer Scientist Should Know About Floating-Point Arithmetic

2

你可以想到JS中的52位整數,但要記住按位邏輯運算符&|>>等等。只會處理32位不重要的位,丟棄其餘的位。