Análisis del funcionamiento del programa de preguntas HIT-ICS Lab1: trampas de los números de punto flotante

Descripción del problema

Nota: Este tema proviene del Análisis de operación del programa HIT-ICS Lab1 de primavera de 2022 (2) Errores de los números de coma flotante.
Siento que todavía lo escribí cuidadosamente para su referencia. Si hay algún problema, corríjame.

Dado un fragmento de código:

int main(){
    
    
	float f;
	for(;;){
    
    
		printf("请输入一个浮点数:");
		scanf("%f", &f);
		printf("这个浮点数的值是:%f\n",f);
		if (f==0) break;
	}
	return 0;
}

Ejecutar entrada:
61.419997
61.419998
61.419999
61.420000
61.420001
0

Ejecutar entrada:
10.186810
10.186811
10.186812
10.186813
10.186814
10.186815
0

Ejecute el programa y analice por qué el resultado de la ejecución del programa es así.
¿A qué debemos prestar atención al comparar números de punto flotante y estadísticas resumidas en programas?

resultado de la operación

Resultado de ejecución 1
Resultado de ejecución 2

Análisis de fenómenos

Solo como referencia. Si hay algún problema, corríjame.

razón:

  1. El almacenamiento de números de coma flotante en una computadora (tomando como ejemplo la precisión simple) consta de 1 bit de signo, 8 bits de código de exponente y 23 bits de mantisa;

  2. Debido a que la mantisa solo tiene 23 dígitos y algunos decimales solo se pueden convertir en infinitos decimales binarios, los requisitos de almacenamiento solo se pueden cumplir interceptando números binarios, lo que implica la cuestión de si se debe redondear después de la intercepción ;

  3. Por lo general, se utiliza el " método de llevar a números pares " para decidir si redondear después de la intercepción;

  4. La computadora trunca los números de coma flotante 61.419997, 61.419998, 61.419999, 61.420000 y 61.420001 de acuerdo con las reglas anteriores y los almacena en la computadora después del procesamiento de acarreo; los bits de signo y los códigos de orden de la representación binaria de estos números de coma flotante son los mismos , y aquí solo se muestra la mantisa, como se muestra en la siguiente figura. Se puede ver que las mantisas truncadas de 61.419997, 61.419998, 61.419999 y 61.420000 son iguales (el cuadro rojo en la parte superior), y las mantisas de 61.420001 y 61.420002 son las mismas (el cuadro rojo en la parte inferior);
    Figura 1

  5. Por lo tanto, las representaciones binarias de 61.419997, 61.419998, 61.419999 y 61.420000 en la computadora son las mismas, y las representaciones binarias de 61.420001 y 61.420002 son las mismas;

  6. Cuando printf en lenguaje C imprime un número en formato% f, primero convierte la representación binaria del número de coma flotante a decimal y luego retiene 6 decimales para el número decimal obtenido. Después de consultar los datos, se descubrió que la base para decidir si redondear en este momento es redondear. , y la representación binaria de los primeros 4 números de punto flotante, después de convertirse a decimal, es 61.41999816894531, después de retener 6 decimales, es 61.419998, y la representación binaria de 61.420001 y 61.420002 , después de convertirlo a decimal, es 61.42000198364258, después de conservar 6 decimales, es 61.4200 02, con Los resultados impresos son consistentes;

  7. En cuanto a por qué el número de la derecha (10.18681x) se puede mostrar normalmente sin errores, el motivo es el mismo que el anterior. Las mantisas de la representación binaria de estos números de punto flotante se muestran en la siguiente figura. Puede ver que el Las mantisas son diferentes, y cuando se convierte a decimal y se interceptan los decimales, el resultado original es el mismo, por lo que se puede mostrar normalmente sin errores.
    Figura 2

Supongo que te gusta

Origin blog.csdn.net/weixin_52027058/article/details/125727962
Recomendado
Clasificación