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)
>>
>
>

Responder a