El punto decimal no se almacena explícitamente en ningún lugar; Eso es un problema de visualización.
La siguiente explicación es una simplificación; Estoy dejando de lado muchos detalles importantes y mis ejemplos no están destinados a representar ninguna plataforma del mundo real. Debería darle una idea de cómo se representan los valores de punto flotante en la memoria y los problemas asociados con ellos, pero querrá encontrar fuentes más autorizadas como Lo que todo informático debe saber sobre la aritmética de punto flotante .
Comience por representar un valor de coma flotante en una variante de notación científica, utilizando la base 2 en lugar de la base 10. Por ejemplo, el valor 3.14159 se puede representar como
0,7853975 * 2 2
0.7853975 es el significado , también conocido como la mantisa; Es la parte del número que contiene los dígitos significativos. Este valor se multiplica por la base 2 elevada a la potencia de 2 para obtener 3.14159.
Los números de coma flotante se codifican almacenando el significado y el exponente (junto con un bit de signo).
Un diseño típico de 32 bits se parece a lo siguiente:
3 32222222 22211111111110000000000
1 09876543 21098765432109876543210
+-+--------+-----------------------+
| | | |
+-+--------+-----------------------+
^ ^ ^
| | |
| | +-- significand
| |
| +------------------- exponent
|
+------------------------ sign bit
Al igual que los tipos enteros con signo, el bit de orden superior indica signo; 0 indica un valor positivo, 1 indica negativo.
Los siguientes 8 bits se usan para el exponente. Los exponentes pueden ser positivos o negativos, pero en lugar de reservar otro bit de signo, están codificados de manera que 10000000 representa 0, por lo que 00000000 representa -128 y 11111111 representa 127.
Los bits restantes se usan para el significado. Cada bit representa una potencia negativa de 2 contando desde la izquierda, entonces:
01101 = 0 * 2 -1 + 1 * 2 -2 + 1 * 2 -3 + 0 * 2 -4 + 1 * 2 -5
= 0.25 + 0.125 + 0.03125
= 0,40625
Algunas plataformas asumen un bit inicial "oculto" en el significado que siempre se establece en 1, por lo que los valores en el significado siempre están entre [0.5, 1). Esto permite que estas plataformas almacenen valores con una precisión ligeramente mayor (más sobre eso a continuación). Mi ejemplo no hace esto.
Entonces nuestro valor de 3.14159 se representaría como algo así como
0 10000010 11001001000011111100111
^ ^ ^
El | El | El |
El | El | + --- significand = 0.7853975 ...
El | El |
El | + ------------------- exponente = 2 (130-128)
El |
+ ------------------------- signo = 0 (positivo)
valor = -1 (signo) * 2 (exponente) * (significado)
valor = -1 0 * 2 2 * 0.7853975 ...
valor = 3.14159 ...
Ahora, algo que notará si suma todos los bits en el significado es que no suman 0.7853975; en realidad salen a 0.78539747. No hay suficientes bits para almacenar el valor exactamente ; solo podemos almacenar una aproximación. El número de bits en el significado determina la precisión o cuántos dígitos significativos puede almacenar. 23 bits nos dan aproximadamente 6 dígitos decimales de precisión. Los tipos de coma flotante de 64 bits ofrecen suficientes bits en el significado para dar aproximadamente 12 a 15 dígitos de precisión. Pero tenga en cuenta que hay valores que no se pueden representar exactamente sin importar cómomuchos bits que usas Así como los valores como 1/3 no pueden representarse en un número finito de dígitos decimales, los valores como 1/10 no pueden representarse en un número finito de bits. Como los valores son aproximados, los cálculos con ellos también son aproximados y se acumulan los errores de redondeo.
El número de bits en el exponente determina el rango (los valores mínimo y máximo que puede representar). Pero a medida que avanza hacia sus valores mínimos y máximos, el tamaño de la brecha entre los valores representables aumenta. Es decir, si no puede representar exactamente valores entre 0.785397 y 0.785398, entonces tampoco puede representar exactamente valores entre 7.85397 y 7.85398, o valores entre 78.5397 y 78.5398, o valores entre 785397.0 y 785398.0. Tenga cuidado al multiplicar números muy grandes (en términos de magnitud) por números muy pequeños.