2012-04-30 7 views
5

Todos los números en Javascript son números de coma flotante de 64bit (8 bytes) pero ¿por qué el rango efectivo de JavaScript es 5e-324 (negativo) a 1.7976931348623157e + 308 (positivo)?Números en Javascript y rango efectivo

+0

De todos los valores posibles, 9007199254740990 de ellos se representan como NaN (No es un número). –

+0

edwardpku, probablemente debería aceptar la respuesta de MДΓΓ БДLL o la mía (dependiendo de si encuentra un puntero a la especificación, o una explicación de por qué la especificación dice eso, más útil). –

+0

gracias, Gareth. : D – edwardpku

Respuesta

8

Porque eso es lo que es defined by the IEEE 754 spec.

0x 0000 0000 0000 0001 = 2⁻¹⁰²²⁻⁵² ≈ 4.9406564584124654 x 10⁻³²⁴ (Min subnormal positive double) 
0x 000f ffff ffff ffff = 2⁻¹⁰²² - 2⁻¹⁰²²⁻⁵² ≈ 2.2250738585072009 x 10⁻³⁰⁸ (Max subnormal positive double) 
0x 0010 0000 0000 0000 = 2⁻¹⁰²² ≈ 2.2250738585072014 x 10⁻³⁰⁸ (Min normal positive double) 
0x 7fef ffff ffff ffff = (1 + (1 - 2⁻⁵²)) x 2¹⁰²³ ≈ 1.7976931348623157 x 10³⁰⁸ (Max Double) 
+1

+ Observe especialmente que la mantisa de 52 bits en la referencia. –

4

Debido a valores denormales; ver p. http://en.wikipedia.org/wiki/Denormal_number. Estos amplían el rango de valores de punto flotante para permitir valores más cercanos a cero de lo que de otro modo sería posible.

Sería conveniente que los tratara como un detalle de implementación cuyo propósito es hacer que los cálculos con resultados intermedios muy pequeños no se comporten de manera demasiado patológica; cuando utilizas estos valores muy pequeños, se pierde cierta precisión.

Cuestiones relacionadas