Ejemplos de representación de números de punto flotante en la memoria (IEEE-754)

Representación de números de coma flotante en la memoria

Ejemplo 1: El número de coma flotante de tipo flotante 125.5 se convierte en un número de coma flotante binario de 32 bits

El código binario de 125.5 es 1111101.1, y la notación científica escrita en binario es: 1.111101 * 2 ^ 6 (porque la parte "entera" de la notación científica es mayor que 1, en binario, la parte "entera" solo puede ser constante 1), es decir, desplazarse hacia la izquierda en 6 bits, luego e = 6, luego E = e + 127 = 133, y E es el código binario 10000101 , y 1.111101 "entero" 1 después de la eliminación parcial de 111,101 , luego se llena con un total cero 23b, exponente formado.

Entonces, el número de punto flotante binario de 32 bits de 125.5 es

0 10000101 111101 00000000000000000

 

 

La representación de números de punto flotante en lenguaje C en la memoria (compilador VC ++):

char: 1 byte

corto: 2 bytes

int: 4 bytes

largo: 4 bytes

flotante: 4 bytes (precisión simple)

doble: 8 bytes (doble precisión)

Referencia: http://www.cnblogs.com/jillzhang/archive/2007/06/24/793901.html

 

Tanto la precisión simple como la precisión doble se dividen en tres partes en almacenamiento:

  1. Bit de signo (signo): 0 significa positivo, 1 significa negativo
  2. Exponente: se utiliza para almacenar datos de exponentes en notación científica y usar el almacenamiento de turnos
  3. Parte de mantisa (Mantisa): parte de mantisa

 El método de almacenamiento del flotador se muestra en la siguiente figura:

 

El método de almacenamiento de doble precisión es:

    Los métodos de almacenamiento de R32.24 y R64.53 usan notación científica para almacenar datos. Por ejemplo, 8.25 se expresa en notación científica decimal como: 8.25 * clip_image0021, y 120.5 se puede expresar como: 1.205 * clip_image0022. Y nuestra computadora no reconoce datos decimales en absoluto, solo reconoce 0 y 1, por lo que en el almacenamiento de la computadora, primero cambie el número anterior a notación científica binaria, 8.25 se puede expresar como 1000.01 en binario (para obtener más detalles, consulte Esto ). 120.5 se expresa en binario como: 1110110.1 expresado en notación científica binaria, 1000.01 se puede expresar como 1.0001 * clip_image002 [2], 1110110.1 se puede expresar como 1.1101101 * clip_image002 [3], y la notación científica de cualquier número es 1.xxx * clip_image002 [1], y la parte de mantisa se puede expresar como xxxx, debido a que el primer dígito es 1, puede omitir el 1 antes del punto decimal, por lo que la parte de 23 bits de la mantisa, la precisión que se puede expresar se convierte en 24 bits, la razón es aquí, que 24 bits puede tener una precisión de unos pocos dígitos después del punto decimal, Sabemos que la representación binaria de 9 es 1001, por lo que 4 bits puede tener una precisión de 1 punto decimal en decimal, 24 bits pueden hacer que la flotación pueda tener una precisión de 6 dígitos después del punto decimal, y para la parte del exponente, porque el exponente puede ser positivo o negativo, exponente de 8 dígitos. El rango de exponentes que se puede expresar debe ser -127-128, por lo que el almacenamiento de la parte del exponente adopta el almacenamiento por turnos, y los datos almacenados son los datos originales +127. Echemos un vistazo a los métodos de almacenamiento reales de 8.25 y 120.5 en la memoria.

      Primero observe 8.25, expresado en notación científica binaria como: 1.0001 *clip_image002 [2]

De acuerdo con el método de almacenamiento anterior, el bit de signo es 0, lo que significa positivo, el bit de exponente es: 3 + 127 = 130 y la parte de mantisa es 0001, por lo que el método de almacenamiento de 8.25 se muestra en la siguiente figura:

 

El método de almacenamiento del número de punto flotante de precisión simple 120.5 se muestra en la siguiente figura:

 

Entonces, si da un dato en la memoria y le dice que está almacenado con precisión simple, ¿cómo sabe el valor decimal de los datos? De hecho, es el proceso inverso al anterior, por ejemplo, se dan los siguientes datos de memoria: 01000001011101101000000000000. Primero, ahora segmentamos los datos, 0 1000 0101110 1101 0000 0000 0000 0000, y el almacenamiento en la memoria es como se muestra en la siguiente figura:

 

De acuerdo con nuestro método de cálculo, se puede calcular que dicho conjunto de datos se expresa como: 1.1101101 * clip_image002 [3]= 120.5

 

El almacenamiento de números de coma flotante de doble precisión es similar al de precisión simple. La diferencia es el número de dígitos en la parte del exponente (11 bits) y la parte de la mantisa (52 bits), y para la parte del exponente, utiliza la precisión doble: datos originales +1023. Así que aquí ya no hay una descripción detallada del método de almacenamiento de doble precisión, solo se da el método de almacenamiento final de 120.5 Puede pensar por qué es así.

Cuadro de texto: 0100 0000 0101 1101 1010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

Déjame resolver una de nuestras dudas sobre este punto de conocimiento básico, mira el siguiente programa y presta atención al resultado.

            flotar f = 2.2f;
            doble d = (doble) f;
            Console.WriteLine (d.ToString ("0.0000000000000"));
            f = 2,25f;
            d = (doble) f;
            Console.WriteLine (d.ToString ("0.0000000000000"));

Los posibles resultados de salida dejan perplejos a todos. Después de convertir el 2.2 de precisión simple a precisión doble, se convierte en 2.2000000476837 después de la precisión de 13 dígitos después del punto decimal, y el 2.25 de precisión simple se convierte en precisión doble y se convierte en 2.2500000000, por qué se convierte 2.2 ¿Después de que se cambia el valor, pero no se cambia 2,25? ¿No es raro? De hecho, mediante la introducción de los dos resultados de almacenamiento anteriores, probablemente podamos encontrar la respuesta. Primero, echemos un vistazo al método de almacenamiento de precisión simple de 2.25. Es muy simple 0 1000 0001001 0000 0000 0000 0000 0000, mientras que la representación de precisión doble de 2.25 es: 0100 0000 0001 0010 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000, entonces 2.25 Durante la conversión forzada, el valor no cambiará, y veamos 2.2 nuevamente. La expresión de 2.2 en notación científica debería ser: el método para convertir un número decimal en un número binario es convertir un número decimal * 2, tome La parte entera, entonces 0.282 = 0.4, entonces el primer dígito del decimal binario es la parte entera 0 de 0.4, 0.4 × 2 = 0.8, el segundo dígito es 0, 0.8 * 2 = 1.6, y el tercer dígito es 1, 0.6 × 2 = 1.2 , El cuarto dígito es 1, 0.2 * 2 = 0.4, y el quinto dígito es 0, por lo que nunca se multiplicará a = 1.0. El binario resultante es una disposición de bucle infinito 00110011001100110011 ... Para datos de precisión simple, La mantisa solo puede representar la precisión de 24 bits, por lo que el flotador de 2.2 se almacena como:

Método de almacenamiento del número 202 de precisión simple

Pero este método de almacenamiento, convertido a valor decimal, no será 2.2, debería ser decimal cuando se convierta a binario, puede ser inexacto, como 2.2, y los datos de tipo doble también tienen el mismo problema, por lo que en números de coma flotante Habrá algunos errores en la representación. También habrá errores al convertir precisión simple en precisión doble. Para datos decimales que se pueden expresar en binario, como 2.25, este error no existirá, por lo que lo anterior parecerá extraño El resultado de salida.

Referencia: http://www.kuqin.com/language/20100606/85209.html

 

 

 

 

 

 

 

 

 

 

 

 

Número de coma flotante de precisión simple: 1 bit de signo, bit de código de pedido de 8 bits, mantisa de 23 bits

Número de coma flotante de doble precisión: 1 bit de signo, bit de código de pedido de 8 bits, mantisa de 52 bits

 

Los números reales se almacenan como números de punto flotante normalizados en la memoria, incluidos los símbolos numéricos, los códigos de pedido y las mantisas. La precisión del número depende del número de dígitos de la mantisa. Por ejemplo, en una máquina de 32 bits, el tipo flotante es de 23 bits y el tipo doble es de 52 bits.

El tamaño del tipo flotante de precisión simple almacenado en la memoria es de 4 bytes, que es de 32 bits.

La forma general de representación de punto flotante es: R = M * 2 ^ e (R: Real M: Mantisa mantisa e: código de orden de exponente)

El binario del flotador anterior se puede dividir en tres partes:

   x xxxxxxxx xxxxxxxxxxxxxxxxxxxxxxx

Símbolo numérico (1b) Código de pedido (8b) Mantisa (23b)

Los números de coma flotante del tipo doble son: símbolo numérico (1b), código de pedido (8b), mantisa (52b)

Signo numérico: el signo de "+" real: 0 "-": 1

Código de pedido e: e = E-127 (e = E-1023 en tipo doble). Un valor positivo significa que el número de coma flotante se ha movido e bits a la izquierda, y un valor negativo significa que el número de coma flotante se ha movido e bits a la derecha. 127 = 2 ^ 7-1 1023 = 2 ^ 10-1

Mantissa M: dígitos significativos, aquí está parte del código binario de los dígitos significativos

Ejemplo 1: El número de coma flotante de tipo flotante 125.5 se convierte en un número de coma flotante binario de 32 bits

El código binario de 125.5 es 1111101.1, y la notación científica escrita en binario es: 1.111101 * 2 ^ 6 (porque la parte "entera" de la notación científica es mayor que 1, en binario, la parte "entera" solo puede ser constante 1), es decir, desplazarse hacia la izquierda en 6 bits, luego e = 6, luego E = e + 127 = 133, y E es el código binario 10000101 , y 1.111101 "entero" 1 después de la eliminación parcial de 111,101 , luego se llena con un total cero 23b, exponente formado.

Entonces, el número de punto flotante binario de 32 bits de 125.5 es

0 10000101 111101 00000000000000000

Ejemplo 2: El número de coma flotante de tipo flotante 0.5 se convierte en un número de coma flotante binario de 32 bits

El código binario de 0.5 es 0.1, y la notación científica escrita en binario es: 1.0 * 2 ^ (- 1), que se desplaza 1 bit a la derecha, luego e = -1, luego E = e + 127 = 126, y el código binario de E es 01111110, y 1.0 después de eliminar 1 de la parte "entero", se convierte en 0, y luego se agrega 0 para formar un código de paso.

 

Entonces, el número de coma flotante binario de 32 bits de 0.5 es

0 01111110 00000000000000000000000

El número de coma flotante de tipo doble es similar.

Ejemplo 3: el número de coma flotante binaria de 32 bits es 0 10000010 00010000000000000000000 convertido a un número de coma flotante decimal

La pregunta se ha dividido en tres partes para nosotros, la parte del número, la parte del código y la parte de la mantisa.

Si la parte del número es 0, significa que el número es positivo; si la parte del código de pedido es 10000010, entonces E = 130, luego e = E-127 = 3, lo que significa que se ha movido 3 dígitos a la izquierda y 0001 agrega "entero" Después de la parte 1, es 1.0001. El número binario original es 1000.1 = 8.5 decimal, o R = 1.0001 * 2 ^ 3 = 8.5

Muchos de estos cálculos son similares. ¡Aprendan unos de otros!

转自 < http://blog.csdn.net/borefo/article/details/4620964 >

Pensamientos causados ​​por (int &) ay la representación de números de punto flotante en la memoria

Vi un fragmento de código hoy, como sigue: por favor escriba su salida

#include <iostream>     

usando el espacio de nombres std;       

int main (void) {         

     flotar a = 1.0f;        

     cout << & a << endl;         

    cout << (int) & a << endl;         

    cout << (int &) a << endl;         

    cout << boolalpha << ((int) a == (int &) a) << endl;      

    flotar b = 0.0f;         

    cout << (int) b << endl;         

    cout << (int &) b << endl;         

    cout << boolalpha << ((int) b == (int &) b) << endl;         

    volver 0 ; 

 }    

 

Al ver este código, algunas cosas conceptuales se confunden a la vez ¿Qué significa (int &) a? Déjame ver el resultado:

0013FF60
1310560
1065353216
falso
0
0
verdadero

 

(int) & a Coaccionar la dirección de a a un entero

(int &) a Convierte a en un tipo de referencia de número entero, que es equivalente a una referencia de número entero, lo que conduce al área de memoria de 32 bits donde se encuentra a, y trata los 32 bits como un número entero.

(int) El valor de aa en la memoria se convierte a tipo int

   Para el número de punto flotante 1.0, de acuerdo con el formato de almacenamiento de número de punto flotante IEEE754, se representa como 3f800000 (0011 1111 1000 0000 0000 0000 0000 0000 0000), (int &) a trata 3f800000 como una salida de tipo int, por lo que el resultado es 1065353216.

Aquí hay una introducción a los formatos de almacenamiento flotante y doble:

Los tipos de datos de punto flotante de C / C ++ son float y double.
 
El tamaño del tipo float es de 4 bytes, que es de 32 bits, y el método de almacenamiento en la memoria es el siguiente: 
dirección alta <---------------------------- ----------> Dirección baja
| Bit de signo | Exponente | Mantisa |
| 1 bit | 8 bit | 23 bit |
31 <------> 30 <-------- -> 22 <----------------------> 0

El tamaño del tipo double es de 8 bytes, es decir, 64 bits, y el diseño de la memoria es el siguiente: 
dirección alta <------------------------------- ---------> Dirección baja
| Bit de signo | Exponente | Mantisa |
| 1 bit | 11 bit | 52 bit |
63 <------> 62 <--------- ---> 51 <---------------------> 0

  
El bit de signo determina el signo del número de coma flotante, 0 significa positivo y 1 significa negativo. Tanto el
exponente como la mantisa se obtienen de la notación científica binaria de números de coma flotante. 
Por ejemplo, la forma binaria del número de coma flotante decimal 2.5 es 10.1 y la conversión a notación científica es (1.01) * (21), lo que muestra que el exponente es 1 y la mantisa (es decir, la parte decimal de la notación científica) es 01. 
De acuerdo con el estándar de almacenamiento de números de punto flotante (hecho por IEEE), el número inicial de exponentes de tipo flotante es 127 (binario 0111 1111) y el número inicial de exponentes de tipo doble es 1023 (binario 011 1111 1111). Sume el exponente sobre esta base para obtener Es la representación del índice en la memoria. La mantisa se rellena directamente, si hay más espacio, se rellena con 0, si no hay suficiente espacio, 0 se redondea a 1. Por lo tanto, los tipos float y double representan 2.5 de la siguiente manera (binario): 
float
| bit de signo | exponente | mantisa
| 0 | 1000 0000 | 010 0000 0000 0000 0000 0000 
doble
| bit de signo | exponente | mantisa
| 0 | 100 0000 0000 | 0100 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000

El número de coma flotante 2.5 se puede representar con precisión mediante decimales binarios (2.5 = 1 * (21) + 0 * (20) + 1 * (2-1)), pero muchos decimales no se pueden representar con precisión, y la parte decimal de su forma binaria se repetirá infinitamente. , Como número de coma flotante -1.2 significa lo siguiente (binario): 
float
| bit de signo | exponente | mantisa        
| 1 | 0111 1111 | 0011 0011 0011 0011 0011 010  
doble
| bit de signo | exponente | mantisa 
| 1 | 011 1111 1111 | 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011 0011

    Dado que la interceptación de la mantisa de bucle infinito sigue un redondeo de 0 a 1, los dígitos 21 a 24 de la mantisa son 0011 y los dígitos 53 a 56 son 0011. La capacidad de la mantisa flotante es de 23 dígitos y la capacidad de la mantisa doble es de 52 dígitos, por lo que la forma flotante Los últimos tres dígitos de es 010 debido a acarreo, y no hay acarreo en la forma doble. 
    La comparación de tipos float y double through ==,>, <etc. No provocará errores de compilación, pero es muy probable que obtenga resultados incorrectos. Esto se debe a que su distribución de memoria es diferente y no se puede comparar directamente. El método correcto es comparar la diferencia entre los dos después de convertir al mismo tipo. Si el resultado es menor que el valor pequeño especificado, se considera igual.

ps:
1) Estándar de número de coma flotante IEEE: número de coma flotante de   
4 bytes: 1 bit de signo, orden de 8 bits (código de desplazamiento con base 127), mantisa de 23 bits;
número de coma flotante de 8 bytes: 1 bit de signo, 11 bits Pedido (código de turno con base 1023), mantisa de 52 bits

2) En VC: el rango de valor flotante es aproximadamente -10e38 ~ 10e38, y se proporcionan 7 dígitos significativos. El número con un valor absoluto menor que 10e38 se procesa en valor cero. El rango de valor doble es aproximadamente -10e308 ~ 10e308, y se proporciona 15 ~ 16 Dígitos significativos, los números cuyo valor absoluto es menor que 10e308 se tratan como cero

Supongo que te gusta

Origin blog.csdn.net/qq_25814297/article/details/108756710
Recomendado
Clasificación