[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