Esta no es una pregunta duplicada, ya que leí la pregunta anterior.
¿Alguien puede ayudarme a entender how float values are stored in the memory
?
Mi duda es que aquí los valores flotantes contienen ' .'
( for example 3.45
) ¿cómo '.'
se representará el en la memoria?
¿Alguien puede aclararme con un diagrama?
c
memory
floating-point
usuario2720323
fuente
fuente
Respuestas:
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 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:
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:
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
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.
fuente
El
.
no está almacenado en absoluto. Primero, debe comprender la notación de ingeniería, que tiene un factor de precisión fijo y un exponente entero:1
es 1.0 · 10 0 =1.0E0
, 2 es2.0E0
, 10 es1.0E1
etc. Esto permite una notación muy corta de números grandes. Mil millones son1.0E9
. El factor antes de que elE
se suele anotada como un número de precisión fija:1.00000E9
. Un resultado de esto es que el número mil millones y uno = 1,000,000,001 y mil millones son los mismos en esta notación, cuando la precisión no es lo suficientemente grande. También tenga en cuenta que el factor nunca necesita un cero a la izquierda. En cambio, el exponente se puede disminuir hasta que ya no sea el caso.En la memoria, un número de coma flotante se representa de manera similar: un bit tiene el signo, algunos bits forman el factor como un número de precisión fija ("mantisa"), los bits restantes forman el exponente. Las diferencias significativas con la notación de ingeniería de base 10 es que, por supuesto, ahora el exponente tiene base 2. El tamaño exacto de cada parte depende del estándar exacto de punto flotante que esté utilizando.
fuente
float
es2^-22 * exponent
aproximadamente 1/4194304.