JavaScript最高可表示数

时间:2015-05-16 17:48:19

标签: javascript node.js

This question询问JavaScript中的最高数字而不会丢失精度。在这里,我询问JavaScript中可表示的最高数字。对另一个问题的一些答案引用了这个问题的答案,但他们没有回答这个问题,所以我希望我在这里安全问。

我试图找到答案,但我中途迷路了。 JavaScript中可表示的最高数字似乎介于2 ^ 1023和2 ^ 1024之间。我用

进一步(在iojs REPL中)
var highest = Math.pow(2, 1023);
for(let i = 1022; i > someNumber; i--) {
  highest += Math.pow(2, someNumber);
}

这里的最高数似乎是someNumber介于969和970之间。这意味着它介于(2 ^ 1023 + 2 ^ 1022 + ... + 2 ^ 970)和(2 ^ 1023 +之间) 2 ^ 1022 + ... + 2 ^ 969)。我不确定如何在没有内存不足和/或等待数年的循环或功能完成的情况下走得更远。

JavaScript中可表示的最高数字是多少? JavaScript是否存储了这个数字的所有数字,或仅存储了一些数字,因为每当我看到10 ^ 21或更高的数字时,它们都用科学记数法表示?为什么JavaScript代表这些极高的数字,特别是如果它可以记住"所有的数字? JavaScript不是一种基本的64种语言吗?

最后,为什么这是最高可表示的数字?我问,因为它不是2的整数指数。是因为它是一个浮点数吗?如果我们采用最高浮点数,那么它是否会与2的指数相关?

2 个答案:

答案 0 :(得分:3)

ECMAScript使用IEEE 754 floating points来表示内存中的所有数字(整数和浮点数)。它使用double precision(64位),因此最大可能的数字将是以下(二进制):

(-1)^0 * (1.1111111111111111111111111111111111111111111111111111)_2 * 2^1023
     ^      ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^        ^^^^
 sign bit                     52 binary digits                         exponent

那是1.9999999999999997779553950749686919152736663818359375 * 2^1023,它完全等于179769313486231570814527423734518473246981451219193357160576872808257310254570927992989173324623785766498017753719800531497718555288192667185248845624861831489179706103179456665410545164365169396987674822445002542175370097858557402467390846365155202987281348776667818932226328810501776426180817703854493120592.218308495538871112145305600。这个数字在JavaScript中也可以Number.MAX_VALUE

答案 1 :(得分:2)

JavaScript使用IEE 754双精度浮点数,即binary64。此格式有1个符号位,11位指数和52位尾数。

最高可能的数字是使用最高可能的指数和尾数编码的数字,带有0符号位。除了7ff(基数16)的指数值用于编码InfinityNaN s。因此,最大数字编码为7fef ffff ffff ffff,其值为(1 +(1 - 2 ^( - 52)))×2 ^ 1023。

有关该公式的更多详细信息,请参阅链接的文章。