[Lenguaje C avanzado] almacenamiento de números de coma flotante en la memoria && extracción de datos de la memoria (estándar IEEE754)

  

 

También hemos usado algunos números de punto flotante antes, entonces, ¿cómo se almacenan en la memoria y cómo se pueden sacar de la memoria? ¿Es lo mismo que el almacenamiento de enteros? Llevarte a entenderlo a través de este artículo.

contenido

Números comunes de punto flotante:

 El punto flotante y el entero se almacenan de manera diferente

como guardar

IEEE 754 establece:

 Aviso:

El índice E se obtiene de la memoria

1. E no es todo 0 o no todo 1

2. E es todo 0

3.E es todo 1s


Números comunes de punto flotante:

3.14159 1E10 (notación científica) La familia de coma flotante incluye: float, double, long double. El rango representado por números de coma flotante se puede encontrar en la ruta de instalación del compilador.El archivo float.h tiene instrucciones.

 El punto flotante y el entero se almacenan de manera diferente

Primero mira el siguiente código:

#include <stdio.h>
int main()
{

	int n = 9;
	float* pFloat = (float*)&n;
	printf("n的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);


	*pFloat = 9.0;
	printf("num的值为:%d\n", n);
	printf("*pFloat的值为:%f\n", *pFloat);
	return 0;
}

¿Puedes pensar en el resultado de ejecutar este código?

resultado de la operación:

analizar:

En este código, si el 9 se almacena como un número entero y luego se accede como un número entero, la impresión sigue siendo 9, pero si se imprime como un tipo de punto flotante, de hecho es 0,000000; 9,0 se almacena como un tipo de punto flotante type. , si se imprime como un número entero, es otro número, pero si se imprime como un número de punto flotante, no hay problema. Se puede ver a partir de esto que los métodos de almacenamiento de punto flotante y entero son diferente.

como guardar

De acuerdo con el estándar internacional IEEE (Instituto de Ingeniería Eléctrica y Electrónica) 754, cualquier número binario de punto flotante V se puede representar de la siguiente forma:

  • (-1)^S * M * 2^E

(-1)^s representa el bit de signo, cuando s=0, V es positivo, cuando s=1, V es negativo

M representa un número significativo, mayor o igual a 1, menor a 2

2^E significa bit de exponente

Ejemplo:

Lo siguiente representa 5.5 en notación científica binaria:

Convertido a binario: 101.1

Escrito en notación científica: 1.011*2^2

Luego, el número se escribe en forma estándar IEEE

El número es positivo, s==0; M==1.011; E==2

Escrito en forma estándar es (-1)^0 *1.011 *2^2

Entonces, de hecho, al almacenar un número de coma flotante de este tipo, solo necesita almacenar S, M y E. Cuando sea necesario, agregue -1 y 2 a este número. Entonces, ¿cómo existen S, M y E?

IEEE 754 establece :

Para un número de coma flotante de 32 bits, el bit más alto es el bit de signo s, los siguientes 8 bits son el exponente E y los 23 bits restantes son la mantisa M

Como se muestra abajo:

 ¿Y si es de tipo doble?

Como se muestra abajo:

Para números de coma flotante de 64 bits, el bit más alto es el bit de signo S, los siguientes 11 bits son el exponente E y los 52 bits restantes son la mantisa M

 Aviso:

De hecho, los números de punto flotante se almacenan así, pero hay algunas cosas a tener en cuenta

  1. Hay 11 bits para almacenar E, pero no se almacena directamente en E, sino que se almacena algo relacionado con E
  2. M es mayor o igual a 1, menor que 2, es decir, no importa si M es 1.xxxxx, entonces no necesita almacenar 1 cada vez, solo necesita almacenar el número después del punto decimal.

IEEE 754 estipula que cuando M se almacena en la computadora, el primer dígito de este número siempre es 1 por defecto, por lo que se puede descartar y solo se guarda la siguiente parte xxxxxx. Por ejemplo, al guardar 1.01, solo se guarda 01, y cuando se lee, se agrega el primer 1. El propósito de esto es ahorrar 1 cifra significativa. Tomando como ejemplo un número de punto flotante de 32 bits, solo quedan 23 bits para M. Después de redondear el 1 en el primer dígito, es equivalente a guardar 24 dígitos significativos.

E es un número entero sin signo (int sin signo) , lo que significa que si E tiene 8 bits, su rango de valores es de 0 a 255; si E tiene 11 bits, su rango de valores es de 0 a 2047. Sin embargo, sabemos que E en notación científica puede tener números negativos, por lo que IEEE 754 estipula que el valor real de E se debe sumar con un número intermedio cuando se almacena en la memoria.Para E de 8 bits, este número intermedio es 127; E de 11 bits, este número intermedio es 1023. Por ejemplo, la E de 2^10 es 10, por lo que cuando se almacena como un número de coma flotante de 32 bits, debe almacenarse como 10+127=137, que es 10001001.

Podemos verificar el anterior 5.5

Forma estándar de 5.5: (-1)^0 *1.011 *2^2

es decir, S->0

E->2+127==129--->10000001

M->011---->01100000000000000000000 (menos de 23 dígitos, complete con 0)

Entonces la memoria debería ser 0100 0000 1011 0000 0000 0000 0000 0000

Convertido a hexadecimal: 40 B0 00 00

mira en la memoria

El índice E se obtiene de la memoria

El índice E se obtiene de la memoria y se puede dividir en tres casos

1. E no es todo 0 o no todo 1

Este es el caso normal, el exponente E calcula el valor menos 127 o 1023 y antepone M con un 1 y un punto decimal

2. E es todo 0

En este momento, el exponente E del número de punto flotante es igual a 1-127 (o 1-1023), que es el valor real, y el número significativo M ya no se suma con el primer 1, pero se restaura a el decimal de 0.xxxxxx. Esto se hace para representar ±0 y números muy pequeños cercanos a 0

3.E es todo 1s

Si E es todo 1, representará directamente un número infinito positivo o negativo

-------------------------------------------------- ---------------

-------------Se completó el almacenamiento de números de punto flotante en lenguaje C---------

Con respecto al lenguaje C, cada punto de conocimiento se escribirá en un blog separado para una introducción más detallada.

¡Bienvenidos todos a prestar atención! ! !

¡Aprender a comunicarnos juntos! ! !

¡Vamos a programar hasta el final! ! !

-------------- No es fácil de organizar, apoye tres consecutivos -------------------

Supongo que te gusta

Origin blog.csdn.net/weixin_46531416/article/details/120756273
Recomendado
Clasificación