コード例 #1
0
ファイル: quantile.c プロジェクト: cran/EMCluster
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);
}
コード例 #2
0
ファイル: order.c プロジェクト: rforge/kmndirs
int doubleCompare(const void* v1, const void* v2)
{
  double d1 = *((const double*)v1);
  double d2 = *((const double*)v2);
  RETURN_CMP(d1, d2);
}
コード例 #3
0
ファイル: order.c プロジェクト: rforge/kmndirs
int intCompare(const void* v1, const void* v2)
{
  int i1 = *((const int*)v1);
  int i2 = *((const int*)v2);
  RETURN_CMP(i1, i2);
}
コード例 #4
0
ファイル: cmp_d.c プロジェクト: mahdiz/mpclib
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
}
コード例 #5
0
ファイル: cmpabs_d.c プロジェクト: mahdiz/mpclib
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
}