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

Reignerok reignerok en gmail.com
Mie Mar 10 21:07:26 CET 2010


Yo creo que el error viene de multiplicar dos números de carácter diferente:
un entero y un real. En el caso de la modificación de tu amiga, está
especificando que ambos son reales de tamaño doble.

El 10 de marzo de 2010 20:08, Jorge García <jorgeantonio49 en gmail.com>escribió:

> 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
>
>
> _______________________________________________
> Lista de correo Cconclase Cconclase en listas.conclase.net
> http://listas.conclase.net/mailman/listinfo/cconclase_listas.conclase.net
> Bajas: http://listas.conclase.net/index.php?gid=2&mnu=FAQ
>
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://listas.conclase.net/pipermail/cconclase_listas.conclase.net/attachments/20100310/059f7dfc/attachment.html>


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