Number.MAX_SAFE_INTEGER 9007199254740991
Number.MAX_VALUE 1.7976931348623157e+308
我知道MAX_SAFE_INTEGER
是如何基于JavaScript的双精度浮点算法来计算的,但是这个巨大的最大值是从哪里来的?如果你使用所有的63位而不是安全的11位作为指数,它是不是得到的数字?
发布于 2016-01-15 04:49:57
Number.MAX_SAFE_INTEGER
是可以在计算中安全使用的最大整数。
例如,Number.MAX_SAFE_INTEGER + 1 === Number.MAX_SAFE_INTEGER + 2
为true --任何大于MAX_SAFE_INTEGER的整数都不能在内存中准确表示。所有位都用来表示数字的位数。
另一方面,Number.MAX_VALUE
是使用双精度浮点表示法可能表示的最大数字。一般来说,数字越大,它的准确性就越低。
维基百科上的更多信息double-precision floating point numbers
发布于 2016-01-15 04:46:16
JS数字在内部是64位浮点数(IEEE 754-2008)。
MAX_SAFE_INTEGER是可以安全地以该格式表示的最大整数,这意味着该值以下(以及MIN_SAFE_INTEGER以上)的所有数字都可以表示为整数。
MAX_VALUE来自2^1023 (11位尾数减去尾数符号),大约是10^308。
如果你使用所有的63位作为指数,而不是安全的11位,那么
是不是这个数字?
尾数(指数)总是11位(不是这样),令人惊讶的是,这对于10^308来说已经足够了。
发布于 2019-02-16 00:38:04
浮点数基本上表示为:
digits * 2 ** movement
数字(尾数)有52位(和1个"hidden bit"),移动有11位,两者一起形成一个64位的数字(带有1个符号位)。通过它,您可以表示各种不同的数字,因为您可以存储非常大的数字(大的正向移动)、非常小的数字(大的负移动)和整数(数字)。
什么是Number.MAX_SAFE_INTEGER?
整数可以用移动来表示,尾数实际上是数字本身,然后数字包含52 +1位数字,并且可以容纳最多2 ** 53 - 1
数字(即Number.MAX_SAFE_INTEGER
)。
现在,对于较大的数字,您必须使用移动,这基本上意味着您向左或向右移动数字,因此您会失去准确性。
(想象一下digits
只需要8位)
number > digits | movement > result
// savely represented
11111111 > 11111111 | 0 > 11111111
// lost the last 1
111111111 > 11111111 | 1 > 111111110
// lost the two last 1s
1111111111 > 11111111 | 10 > 1111111100
什么是Number.MAX_VALUE?
如果你设置digits
的所有位和movement
的所有位,你会得到一个由2 ** 10 - 1
向左移动的数字(2 ** 53 - 1
),这是可以存储在64位中的最大数字,所有更大的都是Infinity
(表示为移动为2 ** 10,尾数为0)。
https://stackoverflow.com/questions/34799226
复制相似问题