[C con Clase] Problema de arimetica entera en mi compilador

Jorge García jorgeantonio49 en gmail.com
Mie Mar 10 20:08:48 CET 2010


Hola!
Antes que nada aclaro que esto no es un chiste de verdad me esta pasando
y no se por que. :(

Resulta que estaba haciendo un programa para ordenar puntos del espacio
(bajo una relación de orden definida por mi) y pues se me ocurrió que
debería implementar una clase envolvente para guardar puntos en 3D con
coordenadas flotantes como enteros y que yo pudiera controlar la
precisión.

Termine la clase y estaba haciéndole pruebas cuando me dio ciertos
resultados inesperados, después de revisar mi código, aun no entiendo
por que. El programa es mas grande, pero lo he reducido a un caso de
prueba lo mas simple que puedo.

Aquí esta el código del error reducido
====== main.c ==========
#include <stdio.h>

int main (int arc, char* argv[]) {
	int factor = 1000;
	
	printf("factor * 1.345 = %d\n", (int)(factor * 1.345));
	printf("factor * 1.245 = %d\n", (int)(factor * 1.245));
	
	printf("1000 * 1.345 = %d\n", (int)(1000 * 1.345));
	printf("1000 * 1.245 = %d\n", (int)(1000 * 1.245));
	
	return 0;
}
=======================
Lo feo del asunto es que las dos primeras lineas imprimen:
factor * 1.345 = 1344
factor * 1.245 = 1245
Mientras que las dos segundas imprimen:
1000 * 1.345 = 1345
1000 * 1.245 = 1245
Es decir en el primer caso, esta calculando un 1344 en vez de 1345.
Le hecho un montón de pruebas y esto solo parece suceder cuando el
numero en cuestión es x.34x, es decir cuando la primer posición decimal
es 3 y la segunda 4. Y que el factor este en una variable, cuando uso la
literal constante "1000", todo va bien.
Originalmente estaba trabajando en C++, pero ya vi que el error persiste
en C. Y lo peor del asunto es que hice el mismo programa en Java y ahí
si funciona perfectamente.
Al final decidí probar el fuente en otra maquina un servidor que
tenemos, y tanto en C, como en C++, como en Java ¡¡funciona bien!!
Luego compile en mi misma maquina pero en windows y ahí esta de nuevo el
error. También compile en una portátil de una amiga y también esta
presente el error. ¡¡¡Y no se por que!!!

Ya para terminar mi queja, mi amiga modifico el código y parece ahora
funcionar en todas las maquinas, pero a mi parecer su código y el mio
deberían de ser equivalentes.

==main2.c ====
#include <stdio.h>

int main (int arc, char* argv[]) {
	int factor = 1000;
	double aux;
	
	aux = (double)factor * (double)1.345;
	
	printf("factor * 1.345 = %d\n", (int)aux);
	
	
	return 0;
}
================
Las maquinas que presentan el error.
En mi maquina compile en gcc 4.2.4 bajo Ubuntu
Y con mingw/3.4.2 bajo windows XP
En la maquina de mi amiga gcc 4.2.1 bajo Fedora
La que nunca presento el error:
Servidor gcc 4.4.1 bajo Red Hat
Mi pregunta es entonces: ¿De que creen que dependa?, y ¿Como ven ambos
códigos?, deberían ser equivalentes, ¿no?.
Gracias por leer, es que sigo tan en shock que tenia que decirle a mas
gente.
-- 
Jorge Antonio Garcia Galicia
http://www.nemediano.com.mx





Más información sobre la lista de distribución Cconclase