Dev - C++ - ¿C++ redondea los números?

 
Vista:
sin imagen de perfil
Val: 21
Ha disminuido su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

¿C++ redondea los números?

Publicado por Jose25 (21 intervenciones) el 13/09/2017 21:36:36
He programado con otros lenguajes y estoy empezando con C++. Estaba escribiendo una rutina y me he encontrado con un problema. Me parece que C++ redondea los números, por lo menos los tipo double. El problema lo resumo con el siguiente programa:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
#include <stdio.h>
 
bool main(){
 
	double z1 = 0.97;
 
	for (int a1 = 0; a1 < 2; a1++){
		z1 = z1 * 10;
 
		if (z1 < 7){
			printf("ok1 %f \n", z1);
		}
		else if (z1 < 10){
			printf("ok2 %f \n", z1);
			z1 = z1 - 9;
		}
		printf("ok3 %f \n", z1);
	}
 
 
	getchar();
 
	return 0;
}

Lo he probado con diferentes compiladores de c++ y en diferentes ordenadores y siempre sale lo mismo:

ok2 9.700000
ok3 0.700000
ok1 7.000000 (Aqui se ve el problema)
ok3 7.000000

¿Que se puede hacer para que C++ no redondee los números?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder
Imágen de perfil de Xhred

¿C++ redondea los números?

Publicado por Xhred (18 intervenciones) el 13/09/2017 23:24:32
El problema de c++ es que no puede representar el numero 0.97 en forma binaria. Y al declarar z1 como 0.97 lo que hace de forma binaria es declararlo como 0.9699..... por eso es que en el tercer ok en lugar de entrar en el segundo if entra en el primer if porque para la computadora el numero es 6.999999..... Te dejo una imagen en excel por si lo quieres comprobar la casilla negra que tiene escrito punto representa que ese es el punto decimal en el sistema binario o sea el 0.97 en esa imagen sería tambien puse las formulas que use en las casillas C2, B2, C1 y B3.
0.11111000010100011110101110000.....
este numero es una representacion en binario pero como la computadora no tiene bits infinitos esta utiliza una aproximación.
decimales-en-binario
Te dejo otra imagen haciendo uso de la depuración y viendo como el programa ve la variable.
numaprox
Bueno espero esto logre explicar el porque de estos errores en la programación.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar
sin imagen de perfil
Val: 21
Ha disminuido su posición en 2 puestos en Dev - C++ (en relación al último mes)
Gráfica de Dev - C++

¿C++ redondea los números?

Publicado por Jose25 (21 intervenciones) el 14/09/2017 01:00:09
Un numero con coma, en la memoria del ordenador son dos números. Uno que dice la cantidad y otro que dice en que posición esta la coma. Si para un numero decimal con coma representado en binario, la coma en el numero binario no estaría entre un bit y otro sino entre el cero y el uno de un bit, pues por ejemplo para un numero binario de 64 bits, la coma podría estar en 128 posiciones. Pero que en el sistema binario, algunos números decimales con coma no se pueden representar, no es de recibo. Me gustaría saber a donde hay que ir en el compilador para cambiar eso.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar