int CompareDouble(const void* v1, const void* v2) { /* written by David Faden. All rights reserved. */ /* same as in sorted.c -- just want to write in contained form */ double d1 = *(const double*)v1; double d2 = *(const double*)v2; RETURN_CMP(d1, d2); }
int doubleCompare(const void* v1, const void* v2) { double d1 = *((const double*)v1); double d2 = *((const double*)v2); RETURN_CMP(d1, d2); }
int intCompare(const void* v1, const void* v2) { int i1 = *((const int*)v1); int i2 = *((const int*)v2); RETURN_CMP(i1, i2); }
int mpz_cmp_d (mpz_srcptr z, double d) { mp_limb_t darray[LIMBS_PER_DOUBLE], zlimb, dlimb; mp_srcptr zp; mp_size_t zsize; int dexp, ret; /* 1. Either operand zero. */ zsize = SIZ(z); if (d == 0.0) return zsize; if (zsize == 0) return (d < 0.0 ? 1 : -1); /* 2. Opposite signs. */ if (zsize >= 0) { if (d < 0.0) return 1; /* >=0 cmp <0 */ ret = 1; } else { if (d >= 0.0) return -1; /* <0 cmp >=0 */ ret = -1; d = -d; zsize = -zsize; } /* 3. Small d, knowing abs(z) >= 1. */ if (d < 1.0) return ret; dexp = __gmp_extract_double (darray, d); ASSERT (dexp >= 1); /* 4. Different high limb positions. */ if (zsize != dexp) return (zsize >= dexp ? ret : -ret); /* 5. Limb data. */ zp = PTR(z); #if LIMBS_PER_DOUBLE == 2 RETURN_CMP (zp[zsize-1], darray[1]); if (zsize == 1) return (darray[0] != 0 ? -ret : 0); RETURN_CMP (zp[zsize-2], darray[0]); RETURN_NONZERO (zp, zsize-2, ret); #else #if LIMBS_PER_DOUBLE == 3 RETURN_CMP (zp[zsize-1], darray[2]); if (zsize == 1) return ((darray[0] | darray[1]) != 0 ? -ret : 0); RETURN_CMP (zp[zsize-2], darray[1]); if (zsize == 2) return (darray[0] != 0 ? -ret : 0); RETURN_CMP (zp[zsize-3], darray[0]); RETURN_NONZERO (zp, zsize-3, ret); #else for (i = 1; i <= LIMBS_PER_DOUBLE; i++) { RETURN_CMP (zp[zsize-i], darray[LIMBS_PER_DOUBLE-i]); if (i >= zsize) RETURN_NONZERO (darray, LIMBS_PER_DOUBLE-i, -ret); } RETURN_NONZERO (zp, zsize-LIMBS_PER_DOUBLE, ret); #endif #endif }
int mpz_cmpabs_d (mpz_srcptr z, double d) { mp_limb_t darray[LIMBS_PER_DOUBLE], zlimb, dlimb; mp_srcptr zp; mp_size_t zsize; int dexp; /* 1. Check for either operand zero. */ zsize = SIZ(z); if (d == 0.0) return (zsize != 0); if (zsize == 0) return (d != 0 ? -1 : 0); /* 2. Ignore signs. */ zsize = ABS(zsize); d = ABS(d); /* 3. Small d, knowing abs(z) >= 1. */ if (d < 1.0) return 1; dexp = __gmp_extract_double (darray, d); ASSERT (dexp >= 1); /* 4. Check for different high limb positions. */ if (zsize != dexp) return (zsize >= dexp ? 1 : -1); /* 5. Limb data. */ zp = PTR(z); #if LIMBS_PER_DOUBLE == 2 RETURN_CMP (zp[zsize-1], darray[1]); if (zsize == 1) return (darray[0] != 0 ? -1 : 0); RETURN_CMP (zp[zsize-2], darray[0]); RETURN_NONZERO (zp, zsize-2, 1); #else #if LIMBS_PER_DOUBLE == 3 RETURN_CMP (zp[zsize-1], darray[2]); if (zsize == 1) return ((darray[0] | darray[1]) != 0 ? -1 : 0); RETURN_CMP (zp[zsize-2], darray[1]); if (zsize == 2) return (darray[0] != 0 ? -1 : 0); RETURN_CMP (zp[zsize-3], darray[0]); RETURN_NONZERO (zp, zsize-3, 1); #else for (i = 1; i <= LIMBS_PER_DOUBLE; i++) { RETURN_CMP (zp[zsize-i], darray[LIMBS_PER_DOUBLE-i]); if (i >= zsize) RETURN_NONZERO (darray, LIMBS_PER_DOUBLE-i, -1); } RETURN_NONZERO (zp, zsize-LIMBS_PER_DOUBLE, 1); #endif #endif }