El 12 de diciembre de 2008 14:59, Alvaro Herrera <alvhe...@alvh.no-ip.org>escribió:
> Felipe de Jesús Molina Bravo escribió: > > > ya probe lo que acorde y sigue igual ... en cuanta a las dudas de la > macro > > de cmp, segun yo esta correcta ... > > > > #define Comparar(x,y) ((x)->num*(y)->den - (x)->den*(y)->num) > > > > si x= 3/4 y= 6/8 entonces > > > > Comparar(x,y)= (3*8) - (4*6) = 0 > > > > si x= 3/4 y= 6/8 entonces > > Sigo pensando que esto no es necesariamente correcto, porque el btree > necesita ser aún mas estricto. Sin embargo > > > x=(57133/ 73908) y= (363669/470447) > > > > Comparar = (57133*470447) - (73908*363669) = 26878048451 - 26878048452= > -1 > > > > mi duda es .... alguna multiplicacion de este tipo podria causar algun > > desbordamiento en el tipo de datos ... no creen? ....lo dudo pero que > > piensan .... > > Obviamente esto podría estar causando el problema. Quizás deberías > hacer las multiplicaciones en uint64, supongo que debería ser algo así > > #define Comparar(x,y) ((uint32) ((uint64)(x)->num* (uint64)(y)->den - \ > (uint64)(x)->den* (uint64)(y)->num)) ya lo probe y volvio a fallar .... pero hice lo que me indicastes en uno de tus correos, comparando los numeradores y denominadores ... y funciono!!!! . La forma en que se me ocurrió implantar la comparación es la siguiente (definitivamente la tengo que analizar un poco mas para expresarla de una manera correcta y mantenible): #define Comparar(x,y) ((x)->num*(y)->den - (x)->den*(y)->num) static int racional_abs_cmp_internal(Racional * a, Racional * b){ double amag; if ( ( a->num == b->num ) && ( a->den == b->den ) ) return 0; if ( ( a->num > b->num ) && ( a->den > b->den ) ) return -1; if ( ( a->num < b->num ) && ( a->den < b->den ) ) return 1; if ( a->den < b->den ) return 1; if ( a->den > b->den ) return -1; if ( (a->num > b->num) && (a->den == b->den) ) return 1; if ( (a->num < b->num) && (a->den == b->den) ) return -1; //por si me falto alguna regla..... amag = Comparar( a, b ); if ( amag < 0 ) //a es menor que cero return -1; if ( amag > 0 ) //a es mayor que b return 1; return 0; //son iguales } En cuanto la termine la posteo Alvaro y a todos los que contribuyeron... muchas gracias ... definitivamente por gente como tu y los que participan en esta lista, postgres esta entre las mejores bases de datos... Seguimos.... > > > -- > Alvaro Herrera > http://www.flickr.com/photos/alvherre/ > "Las cosas son buenas o malas segun las hace nuestra opinión" (Lisias) >