我正在阅读second chapter of the book Eloquent JavaScript。作者说:
Any whole number less than 2^52 (which is more than 10^15) will safely fit in a JavaScript number.
我从wikipedia抓取了2 ^ 52的值。
4,503,599,627,370,496
该值必须小于2 ^ 52,所以我从初始值减去1;
var max = 4503599627370495;
定义max变量后,我正在检查值是什么(我正在使用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 :(得分: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'))
希望这是一个有用的答案。谢谢!
<强>更新强> max int是 - +/- 9007199254740992
答案 1 :(得分: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 = 4503599627370496
和exponent = 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 :(得分:2)
您可以在JS中考虑52位整数,但请记住,按位逻辑运算符&
|
>>
等只会处理32个不太重要的位,而丢弃其余位。< / p>