Dudas sobre los datos de punto flotante
*****El tipo flotante ocupa 4 bytes en la memoria, es decir, 32 bits. De manera similar, el tipo int o long también ocupa 4 bytes después de descomponer los 32 bits respectivos bit a bit. que los significados específicos que representan son bastante diferentes.
****Primero descomponga el entero de 32 bits. Para int sin signo, la descomposición es la siguiente: de derecha a izquierda, registre el valor del i-ésimo bit como bi (0 o 1). , Entonces el valor decimal representado por este bit es: bi * 2^i, i=0, 2,...31. El número binario entero de 4 bytes (32 bits) convertido en número decimal es: b31 * 2^31 ... bi * 2^i ... b1 * 2 b0 * 1 - registrado como "fórmula@".
****Para int con signo, el bit más alto (bit 31) representa el signo, 0 es positivo y 1 es negativo. Los 31 bits restantes deben restarse en 1 y luego invertirse, registrados como ". Operación #", y luego presione la "Fórmula @" anterior para obtener el valor absoluto de este número entero.
**** Lo anterior es una introducción, y la siguiente descomposición flotante también debe basarse en esto. Recuerde los dos significados acordados de "operación #" y "fórmula @". Al mismo tiempo, me gustaría corregir la afirmación del autor de la pregunta de que "el rango que se puede expresar debe ser 0-2^32. El rango numérico exacto de números enteros es: con signo ( (-2^31) —— (2". ^31-1)), Sin firmar (0 - (2^32-1)). Vayamos a la pregunta clave. ¿Qué significan los 32 bits flotantes en la memoria?
***** representa los 32 bits como b31-b0 (de mayor a menor, b31 también es el bit de signo y su significado es 0 positivo y 1 negativo). El total de ***8 bits de b30-b23 es un int con signo. Utilice "operación #" y "fórmula @" para calcular un valor E (el rango decimal es -128 —— 127) y luego páselo por El exponencial. La operación produce 2^E, y el rango decimal es: 1,0 * 10^(-38) - 1,7 * 10^38. Los 23 dígitos restantes b22-b0 representan valores decimales. El valor decimal representado por b22 es: b22 * 2^(-1), que es b22 * 0,5. El valor decimal representado por b21 es: b22 * 2^(-2). , que es b22 * 0,25, y así sucesivamente, por lo que el rango decimal es 0 - 1 (en realidad, 0,0000...1 a 0,9999...).
****De la descomposición anterior, podemos ver que los 32 bits de float tienen sus propios significados y se pueden dividir en 3 bloques, bloque de símbolo S (b31), bloque de exponente E (b30- b23), El bloque decimal D(b22-b0), pero ¿cómo ensamblarlo en un árbol pequeño real? El algoritmo específico es:
(-1)^S * (1.0 D) * 2^E, y el rango de valores final es -3.4*10^-38 - 3.4*10^38.
*****Finalmente, un recordatorio: todos los números de punto flotante pasan por el hardware correspondiente para realizar la "operación #" y la "fórmula @" anteriores al entrar y salir de la memoria. Los programadores no necesitan profundizar en los detalles. Si tienen curiosidad, vale la pena comprenderlos y apoyarlos.