El 12 de diciembre de 2008 16:10, Felipe de Jesús Molina Bravo < [email protected]> escribió:
> > > El 12 de diciembre de 2008 14:59, Alvaro Herrera > <[email protected]>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.... > > > Bien, pues aqui esta como quedo la función: #define Comparar(x,y) ((double) ((double)( (x)->num * (double)(y)->den ) - \ (double)( (x)->den * (double)(y)->num)) ) static int racional_abs_cmp_internal(Racional * a, Racional * b) { double amag; if ( ( a->num == b->num ) && ( a->den == b->den ) ) //1) return 0; if ( a->num == b->num ){ if ( a->den > b->den ) return -1;// 2) return 1; // 3) } if ( a->den == b->den ){ if ( a->num > b->num ) return 1; // 4) return -1; // 7) } 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 } Saludos y reitero el agradecimiento > > >> >> >> -- >> Alvaro Herrera >> http://www.flickr.com/photos/alvherre/ >> "Las cosas son buenas o malas segun las hace nuestra opinión" (Lisias) >> > >
