¿Está esto definido por el idioma? ¿Hay un máximo definido? ¿Es diferente en diferentes navegadores?
javascript
math
browser
cross-browser
TALlama
fuente
fuente
1n << 10000n
es un número muy, muy grande, sin perder precisión, sin necesidad de dependencias (y ni que decir, ni siquiera cerca de un límite).Respuestas:
JavaScript tiene dos tipos de números:
Number
yBigInt
.El tipo de número más utilizado
Number
, es un número IEEE 754 de coma flotante de 64 bits .El valor integral exacto más grande de este tipo es
Number.MAX_SAFE_INTEGER
, que es:Para poner esto en perspectiva: un billón de bytes es un petabyte (o mil terabytes).
"Seguro" en este contexto se refiere a la capacidad de representar enteros exactamente y compararlos correctamente.
De la especificación:
Para usar de forma segura enteros más grandes que esto, debe usar
BigInt
, que no tiene límite superior.Tenga en cuenta que los operadores bit a bit y los operadores de desplazamiento operan con enteros de 32 bits, por lo que en ese caso, el entero seguro máximo es 2 31 -1, o 2,147,483,647.
Nota técnica sobre el tema del número 9,007,199,254,740,992: Hay una representación exacta de IEEE-754 de este valor, y puede asignar y leer este valor desde una variable, por lo tanto, para aplicaciones cuidadosamente seleccionadas en el dominio de enteros menores o iguales a este valor, podría tratarlo como un valor máximo.
En el caso general, debe tratar este valor IEEE-754 como inexacto, porque es ambiguo si está codificando el valor lógico 9,007,199,254,740,992 o 9,007,199,254,740,993.
fuente
4294967295 === Math.pow(2,32) - 1;
> = ES6:
<= ES5
De la referencia :
Mostrar fragmento de código
fuente
Number.MIN_VALUE
es el número positivo más pequeño posible . El menor valor (es decir, menos que cualquier otra cosa) es probablemente-Number.MAX_VALUE
.Number.MIN_SAFE_INTEGER
yNumber.MAX_SAFE_INTEGER
Es 2 53 == 9 007 199 254 740 992. Esto se debe a que los
Number
s se almacenan como coma flotante en una mantisa de 52 bits.El valor mínimo es -2 53 .
Esto hace que pasen cosas divertidas
Y también puede ser peligroso :)
Leer más: http://blog.vjeux.com/2010/javascript/javascript-max_int-number-limits.html
fuente
i += 1000000000
En JavaScript, hay un número llamado
Infinity
.Ejemplos:
Esto puede ser suficiente para algunas preguntas sobre este tema.
fuente
min
variable cuando buscas un valor mínimo.Infinity - 1 === Infinity
1 - Infinity === -Infinity
La respuesta de Jimmy representa correctamente el espectro entero continuo de JavaScript como -9007199254740992 a 9007199254740992 inclusive (perdón 9007199254740993, ¡podrías pensar que eres 9007199254740993, pero estás equivocado! Demostración debajo o en jsfiddle ).
Sin embargo, no hay una respuesta que encuentre / pruebe esto programáticamente (aparte de la que CoolAJ86 aludió en su respuesta que terminaría en 28.56 años;), así que aquí hay una forma un poco más eficiente de hacerlo (para ser precisos, es más eficiente por aproximadamente 28.559999999968312 años :), junto con un violín de prueba :
fuente
x++
le da el valor de x antes de que ocurra el incremento, por lo que eso probablemente explica la discrepancia. Si desea que la expresión se evalúe de la misma manera que el valor final de x, debe cambiarla a++x
.Para estar seguro
Razonamiento
Pensé que sería inteligente y encontraría el valor en el que
x + 1 === x
con un enfoque más pragmático.Mi máquina solo puede contar con 10 millones por segundo más o menos ... así que volveré a publicar con la respuesta definitiva en 28.56 años.
Si no puedes esperar tanto, estoy dispuesto a apostar que
9007199254740992 === Math.pow(2, 53) + 1
es prueba suficiente4294967295
que esMath.pow(2,32) - 1
para evitar los problemas esperados con el desplazamiento de bitsEncontrar
x + 1 === x
:fuente
La respuesta corta es "depende".
Si está utilizando operadores bit a bit en cualquier lugar (o si se refiere a la longitud de una matriz), los rangos son:
No firmado:
0…(-1>>>0)
Firmado:
(-(-1>>>1)-1)…(-1>>>1)
(Sucede que los operadores bit a bit y la longitud máxima de una matriz están restringidos a enteros de 32 bits).
Si no está utilizando operadores bit a bit o trabajando con longitudes de matriz:
Firmado:
(-Math.pow(2,53))…(+Math.pow(2,53))
Estas limitaciones están impuestas por la representación interna del tipo "Número", que generalmente corresponde a la representación de punto flotante de precisión doble IEEE 754. (Tenga en cuenta que, a diferencia de los enteros con signo típicos, la magnitud del límite negativo es la misma que la magnitud del límite positivo, debido a las características de la representación interna, que en realidad incluye un 0 negativo ).
fuente
ECMAScript 6:
fuente
MAX_SAFE_INTEGER
en todos los navegadores trabajando hacia atrás? ¿Deberías avanzar en su lugar? Es decir, Number.MAX_SAFE_INTEGER = 2 * (Math.pow (2, 52) - 1) + 1;Math.pow(2, 53)-1
una operación segura? Va uno más grande que el mayor entero seguro.Muchas respuestas de épocas anteriores han mostrado el resultado
true
de9007199254740992 === 9007199254740992 + 1
verificar que 9 007 199 254 740 991 es el número entero máximo y seguro.¿Qué pasa si seguimos haciendo acumulación?
Podríamos descubrir que entre los números mayores que 9 007 199 254 740 992 , solo los números pares son representables .
Es una entrada para explicar cómo funciona el formato binario de doble precisión de 64 bits en esto. Veamos cómo se mantiene (representa) 9 007 199 254 740 992 utilizando este formato binario.
Usando una versión breve para demostrarlo de 4 503 599 627 370 496 :
En el lado izquierdo de la flecha, tenemos el valor de bit 1 y un punto de raíz adyacente , luego, al multiplicar
2^52
, movemos a la derecha el punto de raíz 52 pasos, y llega al final. Ahora tenemos 4503599627370496 en binario.Ahora comenzamos a acumular 1 a este valor hasta que todos los bits se establezcan en 1, lo que equivale a 9 007 199 254 740 991 en decimal.
Ahora, debido a que en formato binario de 64 bits de doble precisión , asigna estrictamente 52 bits por fracción, no hay más bits disponibles para sumar uno más, así que lo que podemos hacer es establecer todos los bits nuevamente en 0, y manipular la parte exponente:
Ahora obtenemos el 9 007 199 254 740 992 , y con el número mayor que él, lo que el formato podría contener es 2 veces la fracción , significa que ahora cada 1 suma en la parte de la fracción en realidad equivale a 2 sumas, por eso el doble -precisión de formato binario de 64 bits no puede contener números impares cuando el número es mayor que 9 007 199 254 740 992 :
Entonces, cuando el número llega a ser mayor que 9 007 199 254 740 992 * 2 = 18 014 398 509 481 984, solo se pueden mantener 4 veces la fracción :
¿Qué tal el número entre [ 2 251 799 813 685 248 , 4 503 599 627 370 496 )?
El valor de bit 1 después del punto de raíz es 2 ^ -1 exactamente. (= 1/2 , = 0.5) Entonces, cuando el número es menor que 4 503 599 627 370 496 (2 ^ 52), hay un bit disponible para representar las 1/2 veces del entero :
Menos de 2 251 799 813 685 248 (2 ^ 51)
¿Y cuál es el rango disponible de la parte exponente ? el formato le asigna 11 bits. Formato completo de Wiki : (Para más detalles, vaya allí)
Entonces, para que la parte del exponente sea 2 ^ 52, necesitamos exactamente establecer e = 1075.
fuente
Puede que otros ya hayan dado la respuesta genérica, pero pensé que sería una buena idea dar una forma rápida de determinarla:
Lo que me da 9007199254740992 en menos de un milisegundo en Chrome 30.
Pondrá a prueba las potencias de 2 para encontrar cuál, cuando se 'agrega' 1, es igual a sí mismo.
fuente
Cualquier cosa que desee usar para operaciones bit a bit debe estar entre 0x80000000 (-2147483648 o -2 ^ 31) y 0x7fffffff (2147483647 o 2 ^ 31 - 1).
La consola le dirá que 0x80000000 es igual a +2147483648, pero 0x80000000 y 0x80000000 es igual a -2147483648.
fuente
Tratar:
En Firefox 3.6 es 2 ^ 31-1.
fuente
^
significa elevado al poder . En la consola javascript,^
es XOR , no elevado a101
y 2 es010
. Ahora, si los haces Bitwise XOR,5(101) ^ 2(010) = 7(111)
LEERÁS ESTO SI ESTÁS CONFUNDIDO Lo que se está discutiendo aquíMath.pow()
no es el^
operadorEn el momento de la escritura, JavaScript está recibiendo un nuevo tipo de datos:
BigInt
. Es una propuesta TC39 en la etapa 4 que se incluirá en EcmaScript 2020 .BigInt
está disponible en Chrome 67+, FireFox 68+, Opera 54 y Node 10.4.0. Está en marcha en Safari, et al ... Introduce literales numéricos con un sufijo "n" y permite una precisión arbitraria:La precisión aún se perderá, por supuesto, cuando dicho número se coaccione (tal vez involuntariamente) a un tipo de datos numérico.
Y, obviamente, siempre habrá limitaciones de precisión debido a la memoria finita y un costo en términos de tiempo para asignar la memoria necesaria y realizar operaciones aritméticas en números tan grandes.
Por ejemplo, la generación de un número con cien mil dígitos decimales tardará notablemente antes de completarse:
...pero funciona.
fuente
Hice una prueba simple con una fórmula, X- (X + 1) = - 1, y el mayor valor de XI puede funcionar en Safari, Opera y Firefox (probado en OS X) es 9e15. Aquí está el código que usé para probar:
fuente
9000000000000000
hay 1 cifra significativa. en `9007199254740992` hay 15 cifras significativas.9000000000000000
tal como está - tiene1
SF. donde90*10^14
tiene 2. ( sigfigscalculator.appspot.com ) y mathsfirst.massey.ac.nz/Algebra/Decimals/SigFig.htm (sección inferior)Lo escribo así:
Lo mismo para int32
fuente
Vamos a las fuentes
Descripción
Compatibilidad del navegador
fuente
En el javascript incorporado de Google Chrome, puede ir a aproximadamente 2 ^ 1024 antes de que el número se llame infinito.
fuente
En JavaScript, la representación de los números es
2^53 - 1
.Sin embargo ,
Bitwise operation
se calculan32 bits ( 4 bytes )
, lo que significa que si supera los cambios de 32 bits comenzará a perder bits.fuente
Scato escribe:
Los decimales hexadecimales son valores positivos sin signo, por lo que 0x80000000 = 2147483648, eso es matemáticamente correcto. Si desea convertirlo en un valor firmado, debe desplazarse a la derecha: 0x80000000 >> 0 = -2147483648. También puedes escribir 1 << 31.
fuente
Firefox 3 no parece tener un problema con grandes números.
1e + 200 * 1e + 100 calculará bien a 1e + 300.
Safari parece no tener problemas con eso también. (Para el registro, esto está en una Mac si alguien más decide probar esto).
A menos que pierda mi cerebro a esta hora del día, esto es mucho más grande que un entero de 64 bits.
fuente
100000000000000010 - 1 => 100000000000000020
Node.js y Google Chrome parecen estar utilizando valores de coma flotante de 1024 bits, por lo que:
fuente
2^53
se conoce comoMAX_SAFE_INT
porque arriba de ese punto los valores se convierten en aproximaciones, de la misma manera que lo son las fracciones.