fix bad comparisons in devel version.

This commit is contained in:
Vítor Santos Costa 2008-12-29 00:12:54 +00:00
parent 331d1830dd
commit 90d95fdf17
1 changed files with 22 additions and 28 deletions

View File

@ -514,23 +514,17 @@ p_compare(void)
inline static int inline static int
int_cmp(Int dif) int_cmp(Int dif)
{ {
if (dif < 0) return dif;
return(Yap_unify_constant(ARG1,MkAtomTerm(AtomLT)));
else if (dif > 0)
return(Yap_unify_constant(ARG1,MkAtomTerm(AtomGT)));
else
return(Yap_unify_constant(ARG1,MkAtomTerm(AtomEQ)));
} }
inline static int inline static int
flt_cmp(Float dif) flt_cmp(Float dif)
{ {
if (dif < 0.0) if (dif < 0.0)
return(Yap_unify_constant(ARG1,MkAtomTerm(AtomLT))); return -1;
else if (dif > 0.0) if (dif > 0.0)
return(Yap_unify_constant(ARG1,MkAtomTerm(AtomGT))); return 1;
else return 0;
return(Yap_unify_constant(ARG1,MkAtomTerm(AtomEQ)));
} }
@ -539,11 +533,11 @@ a_cmp(Term t1, Term t2)
{ {
if (IsVarTerm(t1)) { if (IsVarTerm(t1)) {
Yap_Error(INSTANTIATION_ERROR, t1, "=:=/2"); Yap_Error(INSTANTIATION_ERROR, t1, "=:=/2");
return(FALSE); return FALSE;
} }
if (IsVarTerm(t2)) { if (IsVarTerm(t2)) {
Yap_Error(INSTANTIATION_ERROR, t2, "=:=/2"); Yap_Error(INSTANTIATION_ERROR, t2, "=:=/2");
return(FALSE); return FALSE;
} }
if (IsFloatTerm(t1) && IsFloatTerm(t2)) { if (IsFloatTerm(t1) && IsFloatTerm(t2)) {
return(flt_cmp(FloatOfTerm(t1)-FloatOfTerm(t2))); return(flt_cmp(FloatOfTerm(t1)-FloatOfTerm(t2)));
@ -558,17 +552,17 @@ a_cmp(Term t1, Term t2)
if (IsIntegerTerm(t2)) { if (IsIntegerTerm(t2)) {
Int i2 = IntegerOfTerm(t2); Int i2 = IntegerOfTerm(t2);
return(int_cmp(i1-i2)); return int_cmp(i1-i2);
} else if (IsFloatTerm(t2)) { } else if (IsFloatTerm(t2)) {
Float f2 = FloatOfTerm(2); Float f2 = FloatOfTerm(t2);
return(flt_cmp(i1-f2)); return flt_cmp(i1-f2);
} else if (IsBigIntTerm(t2)) { } else if (IsBigIntTerm(t2)) {
#ifdef USE_GMP #ifdef USE_GMP
MP_INT *b2 = Yap_BigIntOfTerm(t2); MP_INT *b2 = Yap_BigIntOfTerm(t2);
return(int_cmp(-mpz_cmp_si(b2,i1))); return int_cmp(-mpz_cmp_si(b2,i1));
#endif #endif
} else { } else {
return(FALSE); return FALSE;
} }
} else if (IsFloatTerm(t1)) { } else if (IsFloatTerm(t1)) {
t2 = Yap_Eval(t2); t2 = Yap_Eval(t2);
@ -576,17 +570,17 @@ a_cmp(Term t1, Term t2)
if (IsIntegerTerm(t2)) { if (IsIntegerTerm(t2)) {
Int i2 = IntegerOfTerm(t2); Int i2 = IntegerOfTerm(t2);
return(flt_cmp(f1-i2)); return flt_cmp(f1-i2);
} else if (IsFloatTerm(t2)) { } else if (IsFloatTerm(t2)) {
Float f2 = FloatOfTerm(2); Float f2 = FloatOfTerm(2);
return(flt_cmp(f1-f2)); return flt_cmp(f1-f2);
} else if (IsBigIntTerm(t2)) { } else if (IsBigIntTerm(t2)) {
#ifdef USE_GMP #ifdef USE_GMP
MP_INT *b2 = Yap_BigIntOfTerm(t2); MP_INT *b2 = Yap_BigIntOfTerm(t2);
return(flt_cmp(f1-mpz_get_d(b2))); return flt_cmp(f1-mpz_get_d(b2));
#endif #endif
} else { } else {
return(FALSE); return FALSE;
} }
} else if (IsBigIntTerm(t1)) { } else if (IsBigIntTerm(t1)) {
#ifdef USE_GMP #ifdef USE_GMP
@ -596,20 +590,20 @@ a_cmp(Term t1, Term t2)
if (IsIntegerTerm(t2)) { if (IsIntegerTerm(t2)) {
Int i2 = IntegerOfTerm(t2); Int i2 = IntegerOfTerm(t2);
return(int_cmp(mpz_cmp_si(b1,i2))); return int_cmp(mpz_cmp_si(b1,i2));
} else if (IsFloatTerm(t2)) { } else if (IsFloatTerm(t2)) {
Float f2 = FloatOfTerm(2); Float f2 = FloatOfTerm(2);
return(flt_cmp(mpz_get_d(b1)-f2)); return flt_cmp(mpz_get_d(b1)-f2);
} else if (IsBigIntTerm(t2)) { } else if (IsBigIntTerm(t2)) {
MP_INT *b2 = Yap_BigIntOfTerm(2); MP_INT *b2 = Yap_BigIntOfTerm(2);
return(int_cmp(mpz_cmp(b1,b2))); return int_cmp(mpz_cmp(b1,b2));
} else { } else {
return(FALSE); return FALSE;
} }
} }
#endif #endif
} else { } else {
return(FALSE); return FALSE;
} }
} }