Antecedentes: estoy leyendo "Cómo funcionan los números" en el libro Cómo funciona JavaScript de Douglas Crockford.
Un número en JavaScript se representa como number = sign * coefficient * (2 ** exponent) . Entiendo esto, pero luego hay una función deconstruct para representar un número entero usando el sign , el coefficient y el exponent .
Para encontrar el exponent , el valor inicial se toma como -1128
que es el exponente de 'Number.MIN_VALUE' menos el número de bits en la mantisa menos el bit de bonificación.
function deconstruct(number) { // ..... exponent = -1128; let reduction = coefficient; while (reduction !== 0) { // ..... } ¿Por qué exponent = -1128 ? No entendí la razón para comenzar con este número, por favor ayúdenme a entender esto.
La función de deconstrucción completa como se menciona en el libro.
Aquí se hace una pregunta similar, pero no entendí la respuesta.
Creo que Crockford eligió este valor para que el coefficient resultante sea siempre un número entero de 53 bits.
La función de deconstruct determina el exponente dividiendo repetidamente por dos y contando cuánto tarda en llegar a 0 . Para el número 1 , que tiene un exponente de 0 (para un coeficiente de 1.0 ), se requieren 1075 pasos, por lo que si comenzamos en -1075 y contamos llegaríamos al exponente de 0 . Sin embargo, para obtener el coeficiente largo, queremos llegar a un exponente de -53 , por lo que ya tenemos que empezar en -1128 .
Otra forma de decirlo: Number.MIN_VALUE , que es 1 * 2**-1074 , debe multiplicarse por 2 1074 veces para llegar a 1, luego algunas veces más para obtener el coeficiente largo.
Tenga en cuenta que aquí se pueden cometer varios errores de uno en uno:
1 (un entero de 1 bit) como un entero de 53 bits, necesitamos un exponente de -52 no -5301 bit implícito oculto (para números normales) ¡Y Crockford realmente hizo uno de ellos! Si revisa las matemáticas, 1074 (exponente de MIN_VALUE ) + 52 (dígitos binarios significativos) + 1 ("bit de bonificación", a lo que se refiera) equivale a 1127, no 1128. Llamar a la función de deconstruct devolverá un .coefficient con 54 dígitos binarios, que es demasiado.
Dicho esto, creo que incluso el objetivo es cuestionable. Tener el coeficiente, que en realidad es un número fraccionario que comienza con 1.… , representado como un número entero puede excusarse como recurso didáctico para el libro. Pero no tiene ningún sentido representar números subnormales (cuyos coeficientes son números fraccionarios 0.… ) como números mayores que 2 52 , sin apenas dígitos significativos.