¿Alguien puede explicar la representación del flotador en la memoria?

20

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?

usuario2720323
fuente
21
¿Qué tal la fuente menos esperada, Wikipedia? en.wikipedia.org/wiki/Floating_point#Internal_representation
9000
44
Y puede agregar el artículo principal: punto flotante IEEE
mouviciel
44
Si eres como yo y te gusta aprender jugando con cosas, poniendo entradas y recibiendo salidas, etc., visita
KChaloux
Hay una amplia variedad de formatos de punto flotante, todos diferentes. El punto flotante IEEE es el más común hoy en día, pero no es el único. Cuando era estudiante universitario, tuve que aprender el formato de punto flotante CDC 6600, y tenía algunas ventajas sobre IEEE, siendo el más grande 48 bits de mantisa para precisión simple. IEEE está limitado a aproximadamente 24 bits de mantisa para precisión simple, por lo que cada clase introductoria de métodos numéricos en estos días les dice a los estudiantes "Siempre use doble, no flotante".
John R. Strohm
Ver floating-point-gui.de y recordar esa URL
Basile Starynkevitch

Respuestas:

44

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.

John Bode
fuente
"pero en lugar de reservar otro bit de signo" Lo que estás describiendo es el comportamiento exacto de un entero con signo.
Simon
6

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: 1es 1.0 · 10 0 = 1.0E0, 2 es 2.0E0, 10 es 1.0E1etc. Esto permite una notación muy corta de números grandes. Mil millones son 1.0E9. El factor antes de que el Ese 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.

amon
fuente
3
Esta es la "notación científica". "Notación de ingeniería" es cuando el exponente está restringido a múltiplos de 3.
Clement J.
77
Que se use la base 2 es muy importante. Determina qué valores se pueden almacenar exactamente y cuáles no, e incluso si no puede molestarse en desarrollar una intuición para qué valores (sé que no puedo), al menos debe recordar que los dígitos decimales son completamente inútiles forma de pensar en las carrozas.
1
@delnan: si ayuda, cada bit de la mantisa es la mitad que el bit más alto. Por lo tanto, los flotadores pueden almacenar sumas de poderes negativos de dos: 1/2, 1/4, 1/8, 1/16, 1/32, 1/64, 1/128, etc., hasta el límite de la mantisa . Entonces, el épsilon en un bit de 32 bits floates 2^-22 * exponentaproximadamente 1/4194304.
greyfade